Java apache fop 2.2 一些西里尔字符的错误呈现
Java apache fop 2.2 incorrect rendering of some cyrillic characters
我遇到了一个我自己无法解决的问题。
我试图尽可能地简化源代码,这就是我想出的 - https://www.dropbox.com/s/ey3f65c4iby7ccn/fop_example.zip.
这里是主要的一段代码(模板的代码)
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Arial">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm">
<fo:region-body reference-orientation="0"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block-container>
<fo:block>
ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
</fo:block>
</fo:block-container>
</fo:flow>
</fo:page-sequence>
</fo:root>
我无法简化这个长文本,因为如果我删除任何字符,一切都会正常进行。
所以问题出在最后的字母上。我得到的不是“ИНИОРМАЦИЯ”而是“ИНИОРМ~ИЯ”,如果我删除或添加任何其他西里尔字母,一切都会好的,所以我想问题不在于字体。
这是为什么呢?请帮助我,我不知道出了什么问题或如何解决它。
P.S。这是生成的 pdf 的 link,也许您只需查看此文件就可以说出问题所在。
P.P.S 试图用 ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
替换此文本,仍然得到相同的结果。
在 unicode 中仅包含问题字符的文本:
ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
我设法把这个例子做得更短:
ИмяпсжираКУЛЬДЮШЕВАЯкудсвющийличньорбилетаСЧВыЭГ№ЖНФОРМАЦИЯ
原来是编码方式不对导致的问题
<font kerning="yes" embed-url="/arial.ttf" encoding-mode="single-byte">
<font-triplet name="Arial" style="normal" weight="normal"/>
</font>
我应该使用 cid 而不是 single-byte 因为我嵌入了 .ttf (TrueType) 并且根据 the documentation 默认(我认为这意味着更好)选项是
"cid" for Truetype, "single-byte" for Type 1
然而,我想这是库的一个错误,因为如果我想完全嵌入字体,我必须使用单字节模式。
When embedding TrueType (ttf) or TrueType Collections (ttc), a subset
of the original font, containing only the glyphs used, is embedded in
the output document. That's the default, but if you specify
encoding-mode="single-byte" (see above), the complete font is
embedded.
我遇到了一个我自己无法解决的问题。 我试图尽可能地简化源代码,这就是我想出的 - https://www.dropbox.com/s/ey3f65c4iby7ccn/fop_example.zip.
这里是主要的一段代码(模板的代码)
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Arial">
<fo:layout-master-set>
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm">
<fo:region-body reference-orientation="0"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
<fo:flow flow-name="xsl-region-body">
<fo:block-container>
<fo:block>
ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
</fo:block>
</fo:block-container>
</fo:flow>
</fo:page-sequence>
</fo:root>
我无法简化这个长文本,因为如果我删除任何字符,一切都会正常进行。 所以问题出在最后的字母上。我得到的不是“ИНИОРМАЦИЯ”而是“ИНИОРМ~ИЯ”,如果我删除或添加任何其他西里尔字母,一切都会好的,所以我想问题不在于字体。
这是为什么呢?请帮助我,我不知道出了什么问题或如何解决它。
P.S。这是生成的 pdf 的 link,也许您只需查看此文件就可以说出问题所在。
P.P.S 试图用 ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
替换此文本,仍然得到相同的结果。
在 unicode 中仅包含问题字符的文本:
ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМАЦИЯ
我设法把这个例子做得更短:
ИмяпсжираКУЛЬДЮШЕВАЯкудсвющийличньорбилетаСЧВыЭГ№ЖНФОРМАЦИЯ
原来是编码方式不对导致的问题
<font kerning="yes" embed-url="/arial.ttf" encoding-mode="single-byte">
<font-triplet name="Arial" style="normal" weight="normal"/>
</font>
我应该使用 cid 而不是 single-byte 因为我嵌入了 .ttf (TrueType) 并且根据 the documentation 默认(我认为这意味着更好)选项是
"cid" for Truetype, "single-byte" for Type 1
然而,我想这是库的一个错误,因为如果我想完全嵌入字体,我必须使用单字节模式。
When embedding TrueType (ttf) or TrueType Collections (ttc), a subset of the original font, containing only the glyphs used, is embedded in the output document. That's the default, but if you specify encoding-mode="single-byte" (see above), the complete font is embedded.