itext7 - 在itext7中获取表单字段字体信息
问题描述
我正在使用 itext7 解析 PDF 文档。我已经使用 AcroForm 从文档中获取了所有表单字段,但是我无法使用 GetFont 方法获取与该字段关联的字体。我还尝试解析 /DA 字典,但它以 PDFString 的形式返回。有什么办法可以获取字体信息,或者我必须解析 /DA 字典
解决方案
实际上 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 进行测试
推荐阅读
- google-bigquery - GEOGRAPHY 字段不在一个表中工作,而在另一个表中工作?
- ios - SwiftUI 在主包中找不到命名的图像
- javascript - 如何根据公式提供的值突出显示 HTML 表格中的单元格?(不使用 Jquery)
- regex - 从电子邮件验证正则表达式中排除逗号
- python - Python 嵌套 For 循环。
- javascript - 使用 React 中的新详细信息组件从 json 列表中获取单个项目的详细信息
- git - 部署到 Prod 后自动合并到 master - 如果合并会导致冲突,如何在开始构建之前验证
- pointers - Fortran中用户定义类型的嵌套数据结构
- android-studio - Android 9.+ API 29:/storage/emulated/0/Pictures/myPic.png 打开失败:EACCES(权限被拒绝)
- wordpress - 从不同的端口重定向到子域 - htaccess