【问题标题】:Getting form field font information in itext7在itext7中获取表单字段字体信息
【发布时间】:2019-01-31 08:02:30
【问题描述】:

我正在使用 itext7 解析 PDF 文档。我已经使用 AcroForm 从文档中获取了所有表单字段,但是我无法使用 GetFont 方法获取与该字段关联的字体。我还尝试解析 /DA 字典,但它以 PDFString 的形式返回。有什么办法可以获取字体信息或者我必须解析 /DA 字典

【问题讨论】:

    标签: itext7


    【解决方案1】:

    其实iText 7确实有确定表单域字体信息的方法,毕竟生成表单域外观需要它:PdfFormField.getFontAndSize(PdfDictionary)

    不幸的是,这个方法是protected,所以你必须作弊才能访问它,例如可以从中派生出自己的表单字段类,并在其中公开方法:

    class PdfFormFieldExt extends PdfFormField {
        public PdfFormFieldExt(PdfDictionary pdfObject) {
            super(pdfObject);
        }
    
        public Object[] getFontAndSize(PdfDictionary asNormal) throws IOException {
            return super.getFontAndSize(asNormal);
        }
    }
    

    (来自测试类DetermineFormFieldFonts

    使用这个类,我们可以像这样提取字体信息:

    try (   PdfReader pdfReader = new PdfReader(PDF_SOURCE);
            PdfDocument pdfDocument = new PdfDocument(pdfReader)    ) {
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDocument, false);
        for (Entry<String, PdfFormField> entry : form.getFormFields().entrySet()) {
            String fieldName = entry.getKey();
            PdfFormField field = entry.getValue();
            System.out.printf("%s - %s\n", fieldName, field.getFont());
    
            PdfFormFieldExt extField = new PdfFormFieldExt(field.getPdfObject());
            Object[] fontAndSize = extField.getFontAndSize(field.getWidgets().get(0).getNormalAppearanceObject());
            PdfFont font = (PdfFont) fontAndSize[0];
            Float size = (Float) fontAndSize[1];
            PdfName resourceName = (PdfName) fontAndSize[2];
            System.out.printf("%s - %s - %s - %s\n", Strings.repeat(" ", fieldName.length()),
                    font.getFontProgram().getFontNames(), size, resourceName);
        }
    }
    

    (DetermineFormFieldFonts 测试test)

    应用于this sample document,带有一些文本字段,得到:

    TextAdobeThai - null
                  - AdobeThai-Regular - 12.0 - /AdobeThai-Regular
    TextArial - null
              - Arial - 12.0 - /Arial
    TextHelvetica - null
                  - Helvetica - 12.0 - /Helv
    TextWingdings - null
                  - Wingdings - 12.0 - /Wingdings
    

    如您所见,PdfFormField.getFont() 始终返回 nullPdfFormField.getFontAndSize(PdfDictionary) 返回合理信息。


    使用当前 iText for Java 开发分支 7.1.5-SNAPSHOT 测试

    【讨论】:

    • 感谢您的回答,但在 Itext 中解析 c# 中的字体信息时,/DA 字典包含一半的字体名称。例如,如果字体设置为 Helvetica 或 Courier,那么在 itext7 中它包含像 Helv 或 Cour 这样的文本,这些文本不会在字体系列中进一步翻译。有没有办法获得完整的字体家族名称?
    • @MuddassirAwan 是的,请阅读我的回答。在示例结果中,其 DA 中的文本字段“TextHelvetica”使用名称 Helv,但代码将其解析为“Helvetica”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2015-12-01
    • 2014-01-18
    • 2010-11-19
    • 2023-03-31
    相关资源
    最近更新 更多