pdfbox - 如何修复 PDFBox 设置的 PDF/A 元数据(使用 Docx4j 和 XDocReport)
问题描述
为了达到 PDF/A-1A 的可访问性级别,我正在使用 PDFBox v2.0.13 在 PDF 上设置 XMP 元数据。在设置元数据之前,我将文件从 .docx 转换为 pdf。我尝试了两种进行转换的方法:一种使用 XDocReport v.2.0.1,另一种使用 Docx4j v.6.1.0。
在 Java 类中,我有以下代码:
PDDocumentInformation info = pdf.getDocumentInformation();
info.setTitle("Apache PDFBox");
info.setSubject("Apache PDFBox adding meta-data to PDF document");
info.setCreator("MyCreator");
...
DublinCoreSchema dcSchema = metadata.createAndAddDublinCoreSchema();
dcSchema.setTitle(info.getTitle());
dcSchema.setDescription(info.getSubject());
dcSchema.addCreator(info.getCreator());
使用 XDocReport 进行转换,我得到以下元数据:
</rdf:Description>
<rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">Apache PDFBox</rdf:li>
</rdf:Alt>
</dc:title>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">Apache PDFBox adding meta-data to PDF document</rdf:li>
</rdf:Alt>
</dc:description>
<dc:creator>
<rdf:Seq>
<rdf:li>MyCreator</rdf:li>
</rdf:Seq>
</dc:creator>
</rdf:Description>
而是使用 Docx4j 进行转换,我得到以下元数据:
<rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
<dc:title>
<rdf:Alt>
<rdf:li lang="x-default">Apache PDFBox</rdf:li>
</rdf:Alt>
</dc:title>
<dc:description>
<rdf:Alt>
<rdf:li lang="x-default">Apache PDFBox adding meta-data to PDF document</rdf:li>
</rdf:Alt>
</dc:description>
<dc:creator>
<rdf:Seq>
<rdf:li>MyCreator</rdf:li>
</rdf:Seq>
</dc:creator>
</rdf:Description>
由于“标题”和“描述”生成的元数据不同,使用 XDocReport 生成的最终 pdf 结果 PDF/A-1A 可访问,而使用 Docx4j 生成的最终 pdf 不可访问。
可访问性检查是使用 VeraPDF 进行的。
由于 Docx4j 生成了更具可读性的 PDF,有没有办法修复最终 pdf 中的元数据?
解决方案
docx4j 的 export-FO 使用 Apache FOP (v2.3) 创建 PDF。
所以 export-FO 具有与 FOP v2.3 一样制作 PDF/A-1A 的能力: https ://xmlgraphics.apache.org/fop/2.3/pdfa.html
所以我尝试了:
FOUserAgent foUserAgent = FORendererApacheFOP.getFOUserAgent(foSettings);
foUserAgent.getRendererOptions().put("pdf-a-mode", "PDF/A-1b");
// nb PDF/A-1a, PDF/A-2a and PDF/A-3a require accessibility to be enabled
但它抱怨:
For PDF/A-1b, all fonts, even the base 14 fonts, have to be embedded! Offending font: /Times-Roman
org.apache.fop.pdf.PDFConformanceException: For PDF/A-1b, all fonts, even the base 14 fonts, have to be embedded! Offending font: /Times-Roman
at org.apache.fop.pdf.PDFFont.validate(PDFFont.java:170)
因此,您需要考虑嵌入 base 14 字体。
附带说明一下,我在使用 export-FO 创建的简单 PDF 上尝试了 PDFBox 的 ExtractMetadata 示例。不幸的是,它报告了:
An error ouccred when parsing the meta data: Invalid array definition, expecting Alt and found com.sun.org.apache.xerces.internal.dom.DeferredTextImpl [prefix=dc; name=title]
作为所有这些的替代方案,您可以考虑我们的商业 PDF 转换器。可以生成 PDF/A-2b: https ://converter-eval.plutext.com/pdf_archive.html
推荐阅读
- azure - 根据 URL (web) 将客户端指向正确的服务器
- javascript - 当属性没有值时,dom解析器抛出错误
- ios - 如何使用 Xamarin 在 iOS 上设置 Material Components 标签栏的宽度
- sql-server-data-tools - 需要帮助使用代码将数据库引用添加到数据库项目
- ruby-on-rails - Ruby On Rails Searchkick gem 错误:“NGram Tokenizer 中的 max_gram 和 min_gram 之间的差异必须小于或等于:[1]
- python - 在 python 中修改模块的最佳方法是什么?
- arrays - 找到一对互质数
- angular - Angular 5->8 升级后,材质对话框显示在 DOM 中,但不呈现在屏幕上
- amazon-web-services - NestJS:图像上传和服务 API
- python - Django-rest ,返回自定义的 Json