【发布时间】:2019-01-31 08:02:30
【问题描述】:
我正在使用 itext7 解析 PDF 文档。我已经使用 AcroForm 从文档中获取了所有表单字段,但是我无法使用 GetFont 方法获取与该字段关联的字体。我还尝试解析 /DA 字典,但它以 PDFString 的形式返回。有什么办法可以获取字体信息或者我必须解析 /DA 字典
【问题讨论】:
标签: 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);
}
}
(来自测试类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() 始终返回 null,PdfFormField.getFontAndSize(PdfDictionary) 返回合理信息。
使用当前 iText for Java 开发分支 7.1.5-SNAPSHOT 测试
【讨论】: