gpt4 book ai didi

java - IText AcroField 字符大小

转载 作者:行者123 更新时间:2023-11-30 03:33:38 24 4
gpt4 key购买 nike

我正在使用 java 中的压模创建 acrofields(如下所示),我想找到一种方法来知道 acrofields 的长度。我希望能够确定要在 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.) 您知道字段提供字体自动调整大小吗?如果将字体大小设置为 0,字体将自动调整大小以适合字段。

2.) 您知道文本表单字段可以包含多行吗? (多行文本字段 Ff 位位置 13)

3.) 有maxlen属性,所以你可以自己定义一个字段可以写入多少内容。其定义如下:

MaxLen (integer) - The maximum length of the field’s text, in characters.

4.) 如果这一切都不能满足您的需求,也可以做您想做的事情。你必须做三件事:

a.) 获取字段的长度。关键是方法 getFieldPositions()。返回一组定位信息,您基本上会这样做:

upperRightX 坐标 - lowerLeftX 坐标

这是打印出所有字段的所有长度的代码:

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

b.) 从字段外观 (/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 是正确的 - 如果字体是嵌入的并且在操作系统中不可用,则无法执行 4.),因为您无法从 PDF 中提取字体定义文件(对于合法的文件)和技术 reasons )

更新二:您的意思是您已经有了多行文本字段?在这种情况下,还要测量高度:

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

和文本字段的高度:

float fieldHeight = Math.abs(upperRightY-lowerLeftY)

然后你就知道文本字段可以容纳多少行...

关于java - IText AcroField 字符大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com