IText AcroField字符大小

时间:2015-02-12 20:41:22

标签: java itext acrobat acrofields

我是在带有压模的java中创建acrofields(如下所示),我想找到一种方法来了解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 个答案:

答案 0 :(得分:2)

您的请求有很多替代方案:

1。)你知道字段可以自动调整字体吗?如果将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)
}

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

然后你知道文本字段中有多少行...