Конвертировать docx в PDF/A с помощью docx4j: как встроить базовые 14 шрифтов?
Я пытаюсь использовать docx4j для преобразования файла docx в PDF/A, но получаю сообщение об ошибке:
For PDF/A-2b, all fonts, even the base 14 fonts, have to be embedded! Offending font: /Times-Roman
Мой исходный код:
WordprocessingMLPackage wordMlPackage = WordprocessingMLPackage.load(this.source);
Mapper fontMapper = new IdentityPlusMapper();
Set<String> fontsInUse = wordMlPackage.getMainDocumentPart().fontsInUse();
Set<String> fontsToEmbed = new HashSet<String>(fontsInUse);
fontsToEmbed.add("Times-Roman");
// Make each embedded font available to the font mapper.
for (String fond : fontsToEmbed) {
PhysicalFont physicalFont = PhysicalFonts.get(fond);
if (physicalFont == null) {
physicalFont = PhysicalFonts.get(Mapper.FONT_FALLBACK);
}
fontMapper.put(fond, physicalFont);
}
wordMlPackage.setFontMapper(fontMapper);
FOSettings foSettings = Docx4J.createFOSettings();
foSettings.setWmlPackage(wordMlPackage);
FOUserAgent userAgent = FORendererApacheFOP.getFOUserAgent(foSettings);
userAgent.getRendererOptions().put("pdf-a-mode", "PDF/A-2b");
userAgent.setAccessibility(true);
foSettings.setApacheFopMime("application/pdf");
Docx4J.toFO(foSettings, this.target, Docx4J.FLAG_EXPORT_PREFER_XSL);
Затем я изменил FopConfigUtil.java, чтобы убедиться, что конфигурация apache Fop выглядит следующим образом:
<fop version="1.0">
<strict-configuration>true</strict-configuration>
<renderers>
<renderer mime="application/pdf">
<fonts>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Bold.ttf">
<font-triplet name="Calibri" style="normal" weight="bold"/>
</font>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Bold%20Italic.ttf">
<font-triplet name="Calibri" style="italic" weight="bold"/>
</font>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Italic.ttf">
<font-triplet name="Calibri" style="italic" weight="normal"/>
</font>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Bold.ttf">
<font-triplet name="Times-Roman" style="normal" weight="bold"/>
</font>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Bold%20Italic.ttf">
<font-triplet name="Times-Roman" style="italic" weight="bold"/>
</font>
<font embed-url="file:/Library/Fonts/Times%20New%20Roman%20Italic.ttf">
<font-triplet name="Times-Roman" style="italic" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
И, прочитав его в виде множества возможных постов, я отредактировал файл docx2fo.xslt, добавив семейство шрифтов к корневому элементу:
<fo:root font-family="Times-Roman">
Если я изменю семейство шрифтов в корневом теге, например, на Helvetica, я получу ту же ошибку, но вместо Times-Roman будет сказано, что нарушающим шрифтом является Helvetica. Я не понимаю, почему он просит встроить фонд, пока он настроен в конфигурации fop.