Как исправить метаданные PDF / A, установленные PDFBox (работа с Docx4j и XDocReport) - PullRequest
0 голосов
/ 05 февраля 2019

Чтобы достичь уровня доступности PDF / A-1A, я устанавливаю метаданные XMP для PDF с использованием PDFBox v2.0.13.Перед настройкой метаданных я делаю преобразование файла из .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>

Из-за разницыиз метаданных, созданных для «title» и «description», окончательный PDF-файл, созданный с использованием результатов XDocReport PDF / A-1A, доступен, а файл, созданный с использованием Docx4j, недоступен.

Проверка доступности выполняется с помощью VeraPDF.

Поскольку Docx4j создает более читаемый PDF, есть ли способ исправить метаданные в окончательном PDF?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Это известная проблема, когда 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()

"Сервисный API будет искать имя класса в файле META-INF / services / javax.xml.transform.TransformerFactory в jar-файлах, доступных длявремя выполнения. "

Вы можете принудительно реализовать реализацию по умолчанию, установив системное свойство:

System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");

Однако, возможно, это что-то испортит в другой библиотеке.

Aдругое решение - скопировать исходный код XmpSerializer и изменить вызов newInstance следующим образом:

Transformer transformer = TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null).newTransformer();

Source

0 голосов
/ 08 февраля 2019

Экспортный FO docx4j использует 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 шрифтов.

В качестве примечания я попробовал образец ExtractMetadata в PDFBox на простом PDF, созданном с помощью export-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 Converter.Это может производить PDF / A-2b: https://converter -eval.plutext.com / pdf_archive.html

...