Я создаю 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"); для установки значений.
Есть много альтернатив для вашего запроса:
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)
Затем вы знаете, сколько строк вписывается в текстовое поле...