我一直在努力使用FOP和波兰字母生成PDF。我已经在SO上阅读了很多帖子,但到目前为止还没有成功!
这是我的模板:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="root">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="11pt" font-family='Arial'>
<xsl:value-of select="TestString"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
还有我的XML:
<?xml version="1.0" encoding="utf-8"?>
<root>
<TestString>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.</TestString>
</root>
我的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作为字体系列,如果我在word中键入文本,使用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 = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
"<fop>\n" +
" <renderers>\n" +
" <renderer mime=\"application/pdf\">\n" +
" <fonts>\n" +
" <auto-detect/>\n" +
" </fonts>\n" +
" </renderer>\n" +
" </renderers>\n" +
"</fop>";
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 的配置 xml,以引用系统中的 Arial 字体:
C: \Temp\fopconf.xml
<?xml version="1.0" encoding="utf-8" ?>
<fop>
<renderers>
<renderer mime="application/pdf">
<fonts>
<font kerning="yes" embed-url="file:///C:/windows/fonts/arial.ttf">
<font-triplet name="Arial" style="normal" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
使用<code>file</code>对象在FopFactory构造函数中添加对该配置文件的引用:
// create an instance of fop factory
FopFactory fopFactory = FopFactory.newInstance(new File("C:\\Temp\\fopconf.xml"));
现在,文件应该呈现,字体应该正确:
C:\温度\PolishTest.pdf
编辑:在进一步测试之后,我很幸运地使用了< code >
...
<fonts>
<auto-detect/>
</fonts>
...
问题内容: 我无法从网络服务向数据库发送或显示带有特殊字符的文本。在月食中,我已将字符编码设置为UTF-8,但仍然无法显示字符。例如像下面的代码的简单打印 要么 在控制台上的结果,如果我将其发送到数据库,则结果为??????。我如何使它正确显示在控制台上以及希望在数据库中正确显示 问题答案: 是的,它是XXI 世纪,我们仍在努力处理字符编码等问题。 我的第一个猜测是: 您的源文件编码可能是错误的(
我无法将带有特殊字符的文本从webservice发送或显示到数据库。在我的eclipse上,我已经将字符编码设置为UTF-8,但它仍然不允许我显示字符。例如,一个简单的打印,如下面的代码 或 控制台上的结果是??????,如果我把它发送到我的数据库。我如何使它正确地显示在控制台上,希望在数据库中
问题内容: 我的解析器有问题。我想阅读网站上的图片链接,这通常可以正常工作。但是今天,我得到了一个包含特殊字符的链接,而常规的正则表达式不起作用。 这就是我的代码的样子。 这是html的一部分,会引起麻烦 这是我用来获取src属性部分的正则表达式: 我认为这与链接内的所有特殊字符有关。但是我不确定如何逃避所有这些。我已经尝试过 但是结果是一样的:没有发现任何东西。 问题答案: 该字符通常只匹配换行
问题内容: 我想在Winforms中编写一个小型应用程序,在其中我可以写一些单词,然后使用ADO.net将它们写到SQL数据库中。 当我想用一个占位符写一个字符串时遇到麻烦: 我的数据库中记录的是: 我该如何克服通过传输到我的数据库的C#更改字符串? 这是我的代码的一部分: 问题答案: 您使用参数化的sql。
关于字符集和替代字形 除键盘上可看到的字符之外,字体中还包括许多字符。根据字体的不同,这些字符可能包括连字、分数字、花饰字、装饰字、序数字、标题和文体替代字、上标和下标字符、变高数字和全高数字。字形是特殊形式的字符。例如,在某些字体中,大写字母 A 有几种形式可用,如花饰字或小型大写字母。 插入替代字形的方式有三种: 可以使用选择上下文菜单来查看和插入适用于所选字符的字形。 可以使用“字形”面板来
问题内容: 我该如何更换: “ã”和“ a” “é”和“ e” 在PHP中?这可能吗?我读过某处我可以使用基本字符的ascii值和重音符号的ascii值进行一些数学运算,但是现在找不到任何参考。 问题答案: 这个答案是不正确的。 编写它时,我不理解Unicode规范化。查看francadaval的评论和链接 签出Normalizer类来执行此操作。文档很好,所以我将其链接起来,而不是在这里重复: