如何修复PDF /通过PDFBox的设置的元数据(与Docx4j和XDocReport工作)

问题描述 投票:0回答:2

为了达到可进入等级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>

由于对于“标题”和“说明”所产生的元数据的不同,最终的PDF使用XDocReport结果PDF / A-1A访问产生,而一个使用Docx4j不可访问产生的。

可访问性检查使用VeraPDF制成。

由于Docx4j产生更可读的PDF,是有办法解决在最终的PDF中的元数据?

pdfbox apache-fop docx4j pdfa xdocreport
2个回答
0
投票

这是当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/TransformerFactory.html#newInstance()

“Services API将查找在文件META-INF /服务/ javax.xml.transform.TransformerFactory中的可用运行罐子类名称。”

您可以通过设置系统属性,迫使默认的实现:

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

Source


1
投票

docx4j出口-FO使用Apache FOP(V2.3)创建PDF。

因此,出口-FO有使PDF / A-1A为FOP V2.3相同能力: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)

所以,你需要寻找到嵌入底座14种字体。

作为一个方面说明,我想一个简单的PDF PDFBox的的ExtractMetadata样品使用出口-FO创建。不幸的是,报道说:

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

© www.soinside.com 2019 - 2024. All rights reserved.