我正在使用itext7解析PDF文档。我已经使用AcroForm从文档中获取了所有表单字段,但是我无法使用GetFont方法获取与该字段关联的字体。我也尝试解析/ DA词典,但它以PDFString的形式返回。有什么办法可以获取字体信息,或者我必须解析/ DA词典
答案 0 :(得分: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()
总是返回null
,但是PdfFormField.getFontAndSize(PdfDictionary)
返回的信息是合理的。
使用当前的iText for Java开发分支7.1.5-SNAPSHOT
测试