Есть много альтернатив для вашего запроса:
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)
Тогда вы знаете, сколько строк вписываться в текстовое поле ...
Отличный ответ, очень полный. В случае определения ** MaxLen ** вы также можете обратиться к [этому вопросу] (http://stackoverflow.com/questions/24754825/itext-get-number-of-characters-in-a-field) –
Может возникнуть проблема, если данный шрифт доступен iText только из самого PDF. – mkl
Очень полезно! Также полезна ссылка на MaxLen! Благодаря! Но один вопрос, похоже, что это не учитывает несколько строк? У меня есть действительно большие поля в направлении Y. – Justin