Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用iText时,pdf的acroFields的字体大小为0_Itext - Fatal编程技术网

使用iText时,pdf的acroFields的字体大小为0

使用iText时,pdf的acroFields的字体大小为0,itext,Itext,我正在使用此代码获取PDF的AcroField的字体大小 但名为“first name last name”的AcroField的字体大小为0(尽管其实际字体为32.3) 其他字段的字体大小即将准确。请帮助我获得准确的字体大小 我的代码是 final AcroFields.Item item = acroFields.getFieldItem(fieldName); ArrayList list =null; if(item!=null) list = item.merged;

我正在使用此代码获取PDF的AcroField的字体大小

但名为“first name last name”的AcroField的字体大小为0(尽管其实际字体为32.3)

其他字段的字体大小即将准确。请帮助我获得准确的字体大小

我的代码是

 final AcroFields.Item item = acroFields.getFieldItem(fieldName);

 ArrayList list =null;
 if(item!=null)
    list = item.merged;
    if (list != null) 
    {
    for (final Iterator it1 = list.iterator(); it1.hasNext();) 
    {
        final PdfDictionary itemDict = (PdfDictionary) it1.next();
        final PdfObject da = itemDict.get(PdfName.DA);
        System.out.println(da.toString()); //font size is printing out to be 0;
    }
 }
新代码是

       import java.util.ArrayList;
       import java.util.Iterator;
       import java.util.Map;
       import java.util.Set;
       import com.lowagie.text.pdf.AcroFields;
       import com.lowagie.text.pdf.PRStream;
       import com.lowagie.text.pdf.PdfDictionary;
       import com.lowagie.text.pdf.PdfEncodings;
       import com.lowagie.text.pdf.PdfName;
       import com.lowagie.text.pdf.PdfReader;
       import com.lowagie.text.pdf.PdfStamper;
       import com.lowagie.text.pdf.PdfStream;

     public class MyTest {      

        public static void main(String[] args) {

    String pdfName = "Crunch-Business_card_NRW_edits.pdf";      

    PdfStamper stamper = null;
    FileOutputStream fout = null;   
    try{
        PdfReader reader = new PdfReader(pdfName);
        fout = new FileOutputStream("output.pdf");
        stamper = new PdfStamper(reader, fout); 

        AcroFields acroFields = stamper.getAcroFields();
        Map fieldMap = acroFields.getFields(); 
        Set keys = fieldMap.keySet();

        for (Iterator it = keys.iterator(); it.hasNext();)
        {
            String fieldName  = (String) it.next(); 
            acroFields.setField(fieldName,acroFields.getField(fieldName));

            final AcroFields.Item item = acroFields.getFieldItem(fieldName);
            final ArrayList list = item.merged;
            if (list != null) {
                for (final Iterator it1 = list.iterator(); it1.hasNext();) {
                    final PdfDictionary itemDict = (PdfDictionary) it1.next();

                    PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP);
                    PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N);

                    System.out.println("normalAppearance======"+normalAppearance);// normalAppearance is coming null.
                    byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance);
                    System.out.println(PdfEncodings.convertToString(streamBytes, null));
                }
            }

        }                       
        stamper.setFreeTextFlattening(false);
        stamper.setFormFlattening(false);
        stamper.close(); 
    }
    catch(Exception e){
        e.printStackTrace();
    }

}
}

PDF的链接是

提前感谢。

本质上:

0表示“自动大小”:必须计算适合的大小

详细内容:

让我们看看文档中的字段定义:

52 0 obj
<<
    /Ff 41943042
    /F 4
    /Type/Annot
    /RV(<?xml version="1.0"?>
        <body xfa:APIVersion="Acroform:2.7.0.0" xfa:spec="2.1"
              xmlns="http://www.w3.org/1999/xhtml"
              xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
            <p dir="ltr"
               style="margin-top:0pt;margin-bottom:0pt;text-valign:middle;
                      font-family:'Alternate Gothic LT';font-size:30pt;
                      color:#ffffff">first name last name</p>
        </body>)
    /Subtype/Widget
    /DV(first name last name)
    /T(name)
    /V(first name last name)
    /DS(font: 'Alternate Gothic LT',sans-serif 12.0pt; text-align:left; color:#FFFFFF )
    /AP<</N 7 0 R>>
    /P 21 0 R
    /MK<<>>
    /FT/Tx
    /Rect[36.8297 87.7383 250.89 129.353]
    /DA(/AlternateGothicLT-No3 0 Tf 1 1 1 rg)
>>
endobj
因此,就像您通过iText阅读一样,DA(默认外观)字符串将字体大小设置为0

根据PDF规范第435页,这意味着:

默认外观字符串(DA)包含建立图形状态参数(如文本大小和颜色)所需的任何图形状态或文本状态运算符,以显示字段的可变文本。此字符串中只能出现文本对象中允许的运算符(参见图9)。字符串至少应包括Tf(文本字体)运算符及其两个操作数,字体和大小。指定的字体值应与默认资源字典字体条目中的资源名称相匹配(参考交互式表单字典的DR条目;参见表218)。大小的零值表示字体应自动调整大小:其大小应作为注释矩形高度的函数计算

因此必须计算大小以填充可用空间,但不能超过此空间。

在外观流中,您可以看到,外观的最后一个创建者被认为是32.31 pt来执行此任务

编辑

您可以按如下方式提取正常外观流的字节:

PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP);
PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N);
byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance);
System.out.println(PdfEncodings.convertToString(streamBytes, null));

我尝试了@mkl提供的解决方案,得到了预期的结果。 这就是@mkl解释的解决方案

PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP);
PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N);
byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance);
System.out.println(PdfEncodings.convertToString(streamBytes, null));

你的链接需要一些登录。我已经更新了我以前的链接。感谢你的回复…但是你能详细说明我如何获得准确的大小吗?规范中的引文表明,你应该选择表单字段批注的高度,并将你的字体放入其中。您已经使用的字段项为您提供大小信息,在877383到129353的情况下,差异超过41,6。现在你必须减去一点,以使文字不与边框冲突。前外观创建者使用32.31。您可以从外观流中获取该数字。非常感谢您的即时回复。先生,我是itext的新手。我已尝试获取文档的字段定义。我无法获取“7 0中外观流的内容”。然而,我通过这段代码得到了“文档中的字段定义”。请帮助我获取外观流。我在文档中获取字段定义的代码是---final AcroFields.Item Item=AcroFields.getFieldItem(fieldName);最终ArrayList列表=item.merged;if(list!=null){for(final Iterator it1=list.Iterator();it1.hasNext();){final PdfDictionary itemDict=(PdfDictionary)it1.next();Set asd=itemDict.getKeys();Iterator iter=asd.Iterator();while(iter.hasNext()){PdfName key=(PdfName)iter.next();PdfDictionary itemDict=(PdfDictionary)itemDict.get(PdfName.AP);System.out.println(“\n\nPdfDictionary==”+key+”+itemDict.get(key));Set asd1=itemDict1.getKeys();迭代器iter1=asd1.Iterator();while(iter1.hasNext()){PdfName key1=(PdfName)iter1.next();System.out.println(\n\nPdfDictionary=====“+key1+”+itemDict1.get(key1));}}
PdfDictionary appearanceDict = itemDict.getAsDict(PdfName.AP);
PdfStream normalAppearance = appearanceDict.getAsStream(PdfName.N);
byte[] streamBytes = PdfReader.getStreamBytes((PRStream) normalAppearance);
System.out.println(PdfEncodings.convertToString(streamBytes, null));