Как исправить метаданные PDF/A, установленные PDFBox (работа с Docx4j и XDocReport)
Чтобы достичь уровня доступности 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>
Из-за разницы метаданных, созданных для "заголовка" и "описания", окончательный PDF-файл, созданный с использованием XDocReport, предоставляет результаты PDF/A-1A, в то время как тот, который создан с использованием Docx4j, недоступен.
Проверка доступности производится с помощью VeraPDF.
Поскольку Docx4j создает более читаемый PDF, есть ли способ исправить метаданные в окончательном PDF?
2 ответа
Это известная проблема, когда 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
"Сервисный API будет искать имя класса в файле META-INF/services/javax.xml.transform.TransformerFactory в jar-файлах, доступных для среды выполнения".
Вы можете принудительно реализовать реализацию по умолчанию, установив системное свойство:
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();
Экспортный FO docx4j использует Apache FOP (v2.3) для создания PDF.
Таким образом, export-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