首页 > 解决方案 > 在itext7中获取表单字段字体信息

问题描述

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

标签: itext7

解决方案


实际上 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);
    }
}

(来自测试类DeleteFormFieldFonts

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

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

应用于这个带有一些文本字段的示例文档,得到:

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()总是返回null,但PdfFormField.getFontAndSize(PdfDictionary)返回有意义的信息。


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


推荐阅读