Как использовать пользовательский шрифт в Apache FOP на Java

#java #apache-fop

#java #apache-fop

Вопрос:

Я использую FOP для программного создания PDF.

Но я не могу изменить шрифт по умолчанию… Я хочу использовать определенный шрифт. Итак, я загрузил файл ttf для этого шрифта, но я не могу сделать так, чтобы текст отображался этим шрифтом.

Это мой класс Java, который загружает файл conf и использует файл xsl.

 public File createPDFFile(ByteArrayOutputStream xmlSource) throws IOException, SAXException {
        File file = File.createTempFile(""   System.currentTimeMillis(), EXTENSION);
        URL url = new File(this.getClass().getResource("/UserId.xsl").getFile()).toURI().toURL();
        // creation of transform source
        StreamSource transformSource = new StreamSource(url.openStream());
        // create an instance of fop factory
        FopFactory fopFactory = FopFactory.newInstance(new File(this.getClass().getResource("/conf.xconf").getFile()));
        // a user agent is needed for transformation
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // to store output
        ByteArrayOutputStream pdfoutStream = new ByteArrayOutputStream();
        StreamSource source = new StreamSource(new ByteArrayInputStream(xmlSource.toByteArray()));
        Transformer xslfoTransformer;
        try {
            TransformerFactory transfact = TransformerFactory.newInstance();

            xslfoTransformer = transfact.newTransformer(transformSource);
            // Construct fop with desired output format
            Fop fop;
            try {
                fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, pdfoutStream);
                // Resulting SAX events (the generated FO)
                // must be piped through to FOP
                Result res = new SAXResult(fop.getDefaultHandler());

                // Start XSLT transformation and FOP processing
                try {
                    // everything will happen here..
                    xslfoTransformer.transform(source, res);

                    // if you want to save PDF file use the following code
                    OutputStream out = new java.io.FileOutputStream(file);
                    out = new java.io.BufferedOutputStream(out);
                    FileOutputStream str = new FileOutputStream(file);
                    str.write(pdfoutStream.toByteArray());
                    str.close();
                    out.close();
                } catch (TransformerException e) {
                    e.printStackTrace();
                    return null;
                }
            } catch (FOPException e) {
                e.printStackTrace();
                return null;
            }
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
            return null;
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
            return null;
        }
        return file;
    }
 

Затем в моей конфигурации:

 ....
<fonts>
           <font embed-url="ChaletNewYorkNineteenEighty.ttf">
              <font-triplet name="Chalet" style="normal" weight="normal"/>
              <font-triplet name="Chalet" style="normal" weight="bold"/>
            </font>
....
 

И в моем XLS:

 <fo:block border="solid 0.1mm black" font-family="Chalet" font-size="8pt" font-weight="normal">
 

Но на выходе всегда используется стандартный шрифт, а в консоли я получаю следующее:

 WARN  org.apache.fop.apps.FOUserAgent - Font "Chalet,normal,700" not found. Substituting with "any,normal,700".
 

Ответ №1:

Похоже, ваш embed-url неверен.

Относительные URL-адреса разрешаются относительно свойства font-base (или base), если оно доступно https://xmlgraphics.apache.org/fop/2.1/fonts.html#register

Комментарии:

1. Вы очистили свой кэш шрифтов, как описано ниже: xmlgraphics.apache.org/fop/2.1/fonts.html#font-cache Другая идея состоит в том, чтобы сослаться на каталог, в котором находится ваш шрифт: xmlgraphics.apache.org/fop/2.1/fonts.html#bulk

2. Действительно ли это, если я использую Maven для загрузки зависимости fop? Я не могу найти ни одной папки .fop

3. Я не вижу причины, по которой зависимость maven должна вести себя по-другому. В домашнем каталоге пользователя есть либо каталог «.fop», либо файл «fop-fonts.cache» во временном каталоге.

Ответ №2:

Chalet шрифт не объявлен со стилем шрифта style="normal" и весом шрифта weight="700" в файле conf.xconf. но вы пытаетесь использовать Chalet шрифт с font-weight="700" и style="normal" в вашем шаблоне XLS. следовательно, получите эту ошибку

ПРЕДУПРЕДИТЬ org.apache.fop.apps.FOUserAgent — шрифт «Chalet, обычный, 700» не найден. Замена на «любой, обычный, 700»

настройте Chalet шрифт с style="normal" помощью и weight="700"

 <fonts>
    <font embed-url="ChaletNewYorkNineteenEighty.ttf">
        <font-triplet name="Chalet" style="normal" weight="normal"/>
        <font-triplet name="Chalet" style="normal" weight="700"/>
        <font-triplet name="Chalet" style="normal" weight="bold"/>
    </font>
    .........
</fonts>