为了达到可访问性级别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生成的结果不可访问。
使用VeraPDF进行可访问性检查。
由于 Docx4j 生成了更具可读性的 PDF,有没有办法修复最终 PDF 中的元数据?
当 xmpbox 与某些其他库(例如 FOP)一起使用时,这是一个已知问题。
变压器才是问题所在。
XmpSerializer.java中的此代码:
Transformer transformer = TransformerFactory.newInstance().newTransformer();
应该返回一个 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl
类。
javadoc:https://docs . Oracle . com/javase/7/docs/API/javax/XML/transform/transformer factory . html # new instance()
"服务API将在运行时可用的jar文件META-INF/Services/javax . XML . transform . transformer factory中查找类名。"
您可以通过设置系统属性来强制执行默认实现:
System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
但是,也许这会弄乱其他库中的某些内容。
另一个不同的解决方案是复制XmpSerializer的源代码,并像这样更改newInstance调用:
Transformer transformer = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null).newTransformer();
来源
docx4j的导出 -FO使用阿帕奇 FOP (v2.3) 来创建一个 PDF。
所以export-FO和FOP v 2.3:https://xmlgraphics.apache.org/fop/2.3/pdfa.html一样有能力制作PDF/A-1A
所以我试着:
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)
因此,您需要考虑嵌入基本的14种字体。
作为旁注,我在使用导出FO创建的简单PDF上尝试了PDFBox的提取元数据示例。不幸的是,它报告说:
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
是否可以使用Apache PDFBox来处理PDF/A-3文档?(尤其是更改字段值?) PDFBox 1.8 Cookbook指出,可以使用创建PDF/A-1文档 > 我可以为PDF/A-3文档应用吗? 如果不是:是否可以读取PDF/A-3文档,更改一些字段值,并通过我不需要的>创建/转换为PDF/A-3<但文档仍然是PDF/A-3来安全它?
目前我正在尝试将PDF转换为PDF/A。 然而,不知何故,我不知道我是否可以转换色彩空间,有没有办法这样做? 这是我的代码,然而: 色彩空间被添加但是在验证我得到: 对于每个页面/元素,它都经常出现。 我能做点什么来反对它吗?比如转换颜色空间?使用她的图书馆?
如何使用pdfbox恢复pdf中的上次增量更新? 例如,原始文件签名文件 当我使用增量保存对原始文档进行数字签名(证书签名)时,我会得到一个签名的文档。在检查签名文件的来源时,我可以看到“%%EOF”出现了2次。如果我手动删除最后一个“%%EOF”及其内容,我可以看到PDF返回到其初始状态,这与原始文档非常相似。 我怎样才能务实地做到这一点? 我正在使用PDFBOX v2.0.8 祝你好运,阿披舍
问题内容: 我正在使用Apache PDFBox处理Java应用程序中的PDF文件。我想在每个页面上分割一个PDF文档。 是否有可能做到这一点Apache PDFBox?如果是这样,怎么办? 问题答案: 可以使用来实现。 这是一个示例代码,它将在每个页面上拆分文档: 您可以使用来控制每个拆分的PDF的页数。
我正在迁移一些代码(最初使用iText)来使用PdfBox进行PDF合并。除了创建PDF包或文件夹,一切都很好。我不得不承认,直到现在我才意识到它的存在。 这是我的代码片段(使用iText): 我需要这个,但与PdfBox。 我正在研究两者的 API 和文档,但找不到解决方案。任何帮助都会很棒。 附言。如果我给人留下印象,我需要在iText中解决方案,我需要它在PdfBox中,因为迁移是从iTex
我们正在使用PDFBox从Java桌面应用程序打印一些PDF,并且PDF包含太多空格(不幸的是,修复PDF生成器不是一个选项)。 我的问题是确定页面上的实际内容在哪里,因为裁剪/媒体/修剪/艺术/出血框是无用的。有没有比将页面呈现为图像并检查哪些像素保持白色更好/更快的简单有效的方法?