当前位置: 首页 > 知识库问答 >
问题:

如何修复PDFBox设置的PDF/A元数据(使用Docx4j和XDocReport)

蒋栋
2023-03-14

为了达到可访问性级别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 中的元数据?

共有2个答案

蒙勇
2023-03-14

当 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();

来源

弘伟彦
2023-03-14

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生成器不是一个选项)。 我的问题是确定页面上的实际内容在哪里,因为裁剪/媒体/修剪/艺术/出血框是无用的。有没有比将页面呈现为图像并检查哪些像素保持白色更好/更快的简单有效的方法?