Конвертировать 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.

0 ответов

Другие вопросы по тегам