#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>