2015-02-12 3 views
1

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

   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»); для установки значений.

ответ

2

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

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

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

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

MaxLen (целое число) - Максимальная длина текста месторождения, в символах.

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) 
} 

б) Получить шрифт и FontSize из появления полей (/ 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()); 

) Рассчитайте ширину вашей строки с шрифта и FontSize:

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

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

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

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

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

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

float fieldHeight = Math.abs(upperRightY-lowerLeftY) 

Тогда вы знаете, сколько строк вписываться в текстовое поле ...

+0

Отличный ответ, очень полный. В случае определения ** MaxLen ** вы также можете обратиться к [этому вопросу] (http://stackoverflow.com/questions/24754825/itext-get-number-of-characters-in-a-field) –

+0

Может возникнуть проблема, если данный шрифт доступен iText только из самого PDF. – mkl

+0

Очень полезно! Также полезна ссылка на MaxLen! Благодаря! Но один вопрос, похоже, что это не учитывает несколько строк? У меня есть действительно большие поля в направлении Y. – Justin

 Смежные вопросы

  • Нет связанных вопросов^_^