IText AcroField Размер символов

1

Я создаю acrofields в java с stamper (Как показано ниже), и я хочу найти способ узнать длину acrofield. Я хочу, чтобы определить длину строки, которую я буду вводить в acrofield, и если она слишком длинная, я разделил бы эту строку и поместил бы ее в поле acrofield переполнения. Возможно ли это сделать? Чтобы узнать, сколько персонажей я могу разместить в определенном arcofield?

                OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();

                PdfStamper stamper = new PdfStamper(pdfTemplate, output);
                stamper.setFormFlattening(true);

                AcroFields fields = stamper.getAcroFields();

                setFields(document, fields);

Я также использую fields.setField("AcroFieldName", "Value"); для установки значений.

Теги:
itext
acrobat
acrofields

1 ответ

2
Лучший ответ

Есть много альтернатив для вашего запроса:

1.) Знаете ли вы, что поля предлагают автоматизацию шрифтов? Если вы установите для параметра fontsize значение 0, шрифт будет автоматически установлен в соответствии с полем.

2.) Знаете ли вы, что поля текстовой формы могут содержать несколько строк? (многострочное поле Ff бит 13)

3.) Существует атрибут maxlen, поэтому вы можете сами определить, сколько можно записать в поле. Он определяется следующим образом:

MaxLen (integer) - максимальная длина текста полей в символах.

4.) Если все это не соответствует вашим потребностям, вы можете делать то, что хотите. Вы должны сделать три вещи:

a.) Получите длину поля. Ключом к этому является метод getFieldPositions(). Массив информации о местоположении возвращается туда, где вы в основном выполняете:

upperRightX coordinate - lowerLeftX coordinate

Здесь код, который выводит все длины всех полей:

AcroFields fields = stamper.getAcroFields();
Map<String, AcroFields.Item> fields = acroFields.getFields();
Iterator<Entry<String,Item>> it = fields.entrySet().iterator();

//iterate over form fields
while(it.hasNext()){
    Entry<String,Item> entry = it.next();

    float[] position = acroFields.getFieldPositions(entry.getKey());
    int pageNumber = (int) position[0];
    float lowerLeftX = position[1]; 
    float lowerLeftY = position[2];
    float upperRightX = position[3];
    float upperRightY = position[4];

    float fieldLength = Math.abs(upperRightX-lowerLeftX)
}

б) Получить шрифт и шрифт из внешнего вида полей (/DA)

    //code within the above while()
    PdfDictionary d = entry.getValue().getMerged(0);
    PdfString fieldDA = d.getAsString(PdfName.DA);

    //in case of no form field default appearance create a default one
    if(fieldDA==null) ...

    Object[] infos = AcroFields.splitDAelements(fieldDA.toString());
    if(infos[0]!=null) String fontName = (String)infos[0];
    if(infos[1]!=null) float fontSize= (((Float)infos[1]).floatValue());

c) Вычислите ширину строки с помощью шрифта и шрифта:

    Font font = new Font(fontName,Font.PLAIN,fontSize);
    FontMetrics fm = new Canvas().getFontMetrics(font);  
    int stringWidth = fm.stringWidth("yourString");     

Теперь, если вы сравниваете оба значения, вы знаете, подходит ли строка к вашему полю или нет.

Обновление: MKL прав - в случае, когда Font встроен и недоступен в операционной системе, вы не можете выполнить 4.), так как вы не можете извлечь файл определения шрифта из PDF (по юридическим и техническим причинам)

Обновление II: Вы имеете в виду, что у вас уже есть многострочные текстовые поля? В этом случае также измерьте высоту:

fontMaxHeight = fm.getMaxAscent()+fm.getMaxDescent()+fm.getLeading();

и высота текстового поля:

float fieldHeight = Math.abs(upperRightY-lowerLeftY)

Затем вы знаете, сколько строк вписывается в текстовое поле...

  • 0
    Отличный ответ, очень полный. В случае определения MaxLen вы также можете обратиться к этому вопросу
  • 0
    Могут возникнуть проблемы, если соответствующий шрифт доступен для iText только из самого PDF-файла.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню