/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.icepdf.core.pobjects.acroform; import org.icepdf.core.pobjects.Name; import org.icepdf.core.util.Library; import java.util.HashMap; /** * Text field (field type Tx) is a box or space for text fill-in data typically * entered from a keyboard. The text may be restricted to a single line or may * be permitted to span multiple lines, depending on the setting of the Multi line * flag in the field dictionary’s Ff entry. Table 228 shows the flags pertaining * to this type of field. A text field shall have a field type of Tx. A conforming * PDF file, and a conforming processor shall obey the usage guidelines as * defined by the big flags below. * <br> * The field’s text shall be held in a text string (or, beginning with PDF 1.5, * a stream) in the V (value) entry of the field dictionary. The contents of this * text string or stream shall be used to construct an appearance stream for * displaying the field, as described under 12.7.3.3, "Variable Text." The text * shall be presented in a single style (font, size, colour, and so forth), as * specified by the DA (default appearance) string. * <br> * If the FileSelect flag (PDF 1.4) is set, the field shall function as a file-select * control. In this case, the field’s text represents the pathname of a file whose * contents shall be submitted as the field’s value: * <ul> * <li>For fields submitted in HTML Form format, the submission shall use * the MIME content type multipart/form-data, as described in Internet RFC 2045, * Multipurpose Internet Mail Extensions (MIME), Part One: Format of Internet * Message Bodies (see the Bibliography).</li> * <li>For Forms Data Format (FDF) submission, the value of the V entry in * the FDF field dictionary (see FDF Fields in 12.7.7.3, "FDF Catalog") shall * be a file specification (7.11, "File Specifications") identifying the * selected file.</li> * <li>XML format is not supported for file-select controls; therefore, no * value shall be submitted in this case.</li> * </ul> * Besides the usual entries common to all fields (see Table 220) and to fields * containing variable text (see Table 222), the field dictionary for a text field may * contain the additional entry shown in Table 229. * * @since 5.1 */ public class TextFieldDictionary extends VariableTextFieldDictionary { /** * The maximum length of the fields text, in characters. */ public static final Name MAX_LENGTH_KEY = new Name("MaxLen"); /** * (Radio buttons only) If set, exactly one radio button shall be selected at * all times; selecting the currently selected button has no effect. If clear, * clicking the selected button deselects it, leaving no button selected. */ public static final int MULTILINE_BIT_FLAG = 0x1000; /** * should not be echoed visibly to the screen. Characters typed from the * keyboard shall instead be echoed in some unreadable form, such as asterisks * or bullet characters. * NOTE: To protect password confidentiality, readers should never store the * value of the text field in the PDF file if this flag is set. */ public static final int PASSWORD_BIT_FLAG = 0x2000; /** * (PDF 1.4) If set, the text entered in the field represents the pathname of * a file whose contents shall be submitted as the value of the field. */ public static final int FILE_SELECT_BIT_FLAG = 0x100000; /** * (PDF 1.4) If set, text entered in the field shall not be spell-checked. */ public static final int TEXT_DO_NOT_SPELL_CHECK_BIT_FLAG = 0x100000; /** * (PDF 1.4) If set, the field shall not scroll (horizontally for single-line * fields, vertically for multiple-line fields) to accommodate more text than * fits within its annotation rectangle. Once the field is full, no further * text shall be accepted for interactive form filling; for non-interactive * form filling, the filler should take care not to add more character than * will visibly fit in the defined area. */ public static final int DO_NOT_SCROLL_BIT_FLAG = 0x800000; /** * (PDF 1.5) May be set only if the MaxLen entry is present in the text field * dictionary (see Table 229) and if the Multiline, Password, and FileSelect * flags are clear. If set, the field shall be automatically divided into as * many equally spaced positions, or combs, as the value of MaxLen, and the * text is laid out into those combs. */ public static final int COMB_BIT_FLAG = 0x1000000; public enum TextFieldType { TEXT_INPUT, TEXT_AREA, TEXT_PASSWORD, FILE_SELECT } /** * (PDF 1.5) If set, the value of this field shall be a rich text string * (see 12.7.3.4, "Rich Text Strings"). If the field has a value, the RV entry * of the field dictionary (Table 222) shall specify the rich text string. */ public static final int RICH_TEXT_BIT_FLAG = 0x2000000; protected TextFieldType textFieldType; protected int maxLength = 0; public TextFieldDictionary(Library library, HashMap entries) { super(library, entries); // parse out max length. Object value = library.getObject(entries, MAX_LENGTH_KEY); if (value != null && value instanceof Number) { maxLength = ((Number) value).intValue(); } // determine the text type int flags = getFlags(); if ((flags & MULTILINE_BIT_FLAG) == MULTILINE_BIT_FLAG) { textFieldType = TextFieldType.TEXT_AREA; } else if ((flags & PASSWORD_BIT_FLAG) == PASSWORD_BIT_FLAG) { textFieldType = TextFieldType.TEXT_PASSWORD; } else if ((flags & FILE_SELECT_BIT_FLAG) == FILE_SELECT_BIT_FLAG) { textFieldType = TextFieldType.FILE_SELECT; } else { textFieldType = TextFieldType.TEXT_INPUT; } } public int getMaxLength() { return maxLength; } public TextFieldType getTextFieldType() { return textFieldType; } /** * Field may container multiple lines of text. * * @return true if multiline text, otherwise false. */ public boolean isMultiLine() { return (getFlags() & MULTILINE_BIT_FLAG) == MULTILINE_BIT_FLAG; } /** * Filed is a file select component. * * @return true if file select, otherwise false. */ public boolean isFileSelect() { return (getFlags() & FILE_SELECT_BIT_FLAG) == FILE_SELECT_BIT_FLAG; } /** * If set, the field shall not scroll (horizontally for single-line fields, vertically for multiple-line fields) * to accommodate more text than fits within its annotation rectangle. Once the field is full, no further text * shall be accepted for interactive form filling; for non-interactive form filling, the filler should take care * not to add more character than will visibly fit in the defined area. * * @return true if do not scroll is enabled, otherwise false. */ public boolean isDoNotScroll() { return (getFlags() & DO_NOT_SCROLL_BIT_FLAG) == DO_NOT_SCROLL_BIT_FLAG; } /** * May be set only if the MaxLen entry is present in the text field dictionary (see Table 229) and if the Multiline, * Password, and FileSelect flags are clear. If set, the field shall be automatically divided into as many equally * spaced positions, or combs, as the value of MaxLen, and the text is laid out into those combs. * * @return true if comb is enabled, otherwise false. */ public boolean isComb() { return (getFlags() & COMB_BIT_FLAG) == COMB_BIT_FLAG; } /** * If set, the value of this field shall be a rich text string (see 12.7.3.4, "Rich Text Strings"). If the field has * a value, the RV entry of the field dictionary (Table 222) shall specify the rich text string. * * @return true if file select, otherwise false. */ public boolean isRichText() { return (getFlags() & RICH_TEXT_BIT_FLAG) == RICH_TEXT_BIT_FLAG; } }