使用Apache FOP时无法使用波兰语特殊字母

使用FOP生成PDF并使用波兰语字母,我一直在努力。 我一直在这里阅读很多post,但到目前为止还没有成功!

这是我的模板:

                   

我的XML:

   Chcemy mieć pewność, że nasze produkty będą miały długą żywotność i stosujemy opakowania, aby uchronić je przed uszkodzeniem podczas przenoszenia i transportu.  

和我的Java代码调用它:

 private void PolishTest() throws IOException, FOPException, TransformerException { // the XSL FO file File xsltFile = new File("C:\\Temp\\PolishTest.xsl"); // the XML file which provides the input StreamSource xmlSource = new StreamSource(new File("C:\\Temp\\PolishTest.xml")); // create an instance of fop factory FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI()); // a user agent is needed for transformation FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); // Setup output OutputStream out = new FileOutputStream("C:\\Temp\\PolishTest.pdf"); try { // Construct fop with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); // Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(xsltFile)); // Resulting SAX events (the generated FO) must be piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); // Start XSLT transformation and FOP processing // That's where the XML is first transformed to XSL-FO and then // PDF is created transformer.transform(xmlSource, res); } finally { out.close(); } } 

在我的模板中看到我使用Arial作为字体系列,如果我在单词中键入文本,使用Arial它可以很好地工作。 但是当从Java调用它时

我收到很多警告:

 jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Font "Arial,normal,400" not found. Substituting with "any,normal,400". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ć" (0x107, cacute) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ś" (0x15b, sacute) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ż" (0x17c, zdot) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ę" (0x119, eogonek) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ą" (0x105, aogonek) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent WARNING: Glyph "ł" (0x142, lslash) not available in font "Times-Roman". jul. 10, 2018 8:16:57 AM org.apache.fop.events.LoggingEventListener processEvent 

所以我的问题是(因为)我做错了什么?

为什么FOP选择“Times-Roman”,即使我已经指定了Arial? 更重要的是如何解决它?

**更新**

使用am9417的答案代码,我已将Java代码更新为以下内容:

 private static String config = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; private void PolishTest() throws IOException, SAXException, TransformerException { // the XSL FO file File xsltFile = new File("C:\\Temp\\PolishTest.xsl"); // the XML file which provides the input StreamSource xmlSource = new StreamSource(new File("C:\\Temp\\PolishTest.xml")); // create an instance of fop factory URI uri = new File(".").toURI(); InputStream configSource = new ByteArrayInputStream(config.getBytes()); FopFactory fopFactory = FopFactory.newInstance(uri, configSource); // a user agent is needed for transformation FOUserAgent foUserAgent = fopFactory.newFOUserAgent(); // Setup output OutputStream out = new FileOutputStream("C:\\Temp\\PolishTest.pdf"); try { // Construct fop with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out); // Setup XSLT TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(xsltFile)); // Resulting SAX events (the generated FO) must be piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); // Start XSLT transformation and FOP processing // That's where the XML is first transformed to XSL-FO and then // PDF is created transformer.transform(xmlSource, res); } finally { out.close(); } } 

这个答案可能包含一些有用的信息。 所有错误都是由于找不到Arial字体引起的,这就是为什么它切换到Times-Roman,因为无法找到特殊字符(由于某种原因)。

因此,在该答案中,使用以下内容为FOP添加config xml以引用系统中的Arial字体:

C:\ TEMP \ fopconf.xml

             

使用File对象在FopFactory构造函数中添加对该配置文件的引用:

 // create an instance of fop factory FopFactory fopFactory = FopFactory.newInstance(new File("C:\\Temp\\fopconf.xml")); 

现在文件应该渲染,字体应该是正确的:

C:\ TEMP \ PolishTest.pdf

PDF屏幕截图

编辑:进一步测试后,我很幸运标签。 但是,在尝试搜索字体时,渲染需要花费更多时间。 如果您不知道字体文件位置,这可能很有用。 你可能想尝试一下:

 ...    ...