Java apache fop 2.2对一些西里尔字符的错误呈现

时间:2017-09-15 22:08:01

标签: java pdf xsl-fo apache-fop

我遇到了一个无法自行解决的问题。 我试图尽可能地简化源代码,这就是我想到的 - 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>

我无法简化这个长文本,因为如果删除任何字符,一切都会正常工作。 所以问题在于最后的字母。而不是“ИНФОРМАЦИЯ”我得到“ИНФОРМ〜ИЯ”,如果我删除或添加任何其他西里尔字母一切都会好的,所以我猜问题不是字体。

enter image description here

为什么?请帮助我,我不知道有什么问题或如何解决它。

P.S。这是结果pdf的link,也许您可​​以通过查看此文件来说明错误。

P.P.S试图用&#x0418;&#x043c;&#x044f;&#x043f;&#x0430;&#x0441;&#x0441;&#x0430;&#x0436;&#x0438;&#x0440;&#x0430;&#x041a;&#x0423;&#x041b;&#x042c;&#x0414;&#x042e;&#x0428;&#x0415;&#x0412;&#x0410;&#x041b;&#x0418;&#x042f;&#x0410;&#x041b;&#x0415;&#x041a;&#x0421;&#x0410;&#x041d;&#x0414;&#x0420;&#x041e;&#x0412;&#x041d;&#x0410;&#x0414;&#x043e;&#x043a;&#x0443;&#x043c;&#x0435;&#x043d;&#x0442;&#x0443;&#x0434;&#x043e;&#x0441;&#x0442;&#x043e;&#x0432;&#x0435;&#x0440;&#x044f;&#x044e;&#x0449;&#x0438;&#x0439;&#x043b;&#x0438;&#x0447;&#x043d;&#x043e;&#x0441;&#x0442;&#x044c;&#x041d;&#x043e;&#x043c;&#x0435;&#x0440;&#x0431;&#x0438;&#x043b;&#x0435;&#x0442;&#x0430;&#x0414;&#x043e;&#x0421;&#x041e;&#x0427;&#x0418;&#x0421;&#x041e;&#x0427;&#x0420;&#x0435;&#x0439;&#x0441;&#x0418;&#x0416;&#x0412;&#x044b;&#x043b;&#x0435;&#x0442;&#x0410;&#x0412;&#x0413;&#x041a;&#x043b;&#x0430;&#x0441;&#x0441;&#x042d;&#x0420;&#x0415;&#x0413;&#x2116;&#x0412;&#x0410;&#x0416;&#x041d;&#x0410;&#x042f;&#x0418;&#x041d;&#x0424;&#x041e;&#x0420;&#x041c;&#x0410;&#x0426;&#x0418;&#x042f;替换此文本,仍然得到相同的结果。

仅在unicode中显示问题字符的文本:

ИмяпассажираКУЛЬДЮШЕВАЛИЯАЛЕКСАНДРОВНАДокументудостоверяющийличностьНомербилетаДоСОЧИСОЧРейсИЖВылетАВГКлассЭРЕГ№ВАЖНАЯИНФОРМ&#x0410;&#x0426;&#x0418;Я

我设法做的更简短:

ИмяпсжираКУЛЬДЮШЕВАЯкудсвющийличньорбилетаСЧВыЭГ№ЖНФОРМАЦИЯ

1 个答案:

答案 0 :(得分:2)

事实证明问题是因为编码模式不正确。

<font kerning="yes" embed-url="/arial.ttf" encoding-mode="single-byte">
    <font-triplet name="Arial" style="normal" weight="normal"/>
</font>

我应该使用 cid 而不是单字节,因为我嵌入.ttf(TrueType)并根据the documentation默认(我认为这意味着优选)选项是

  

“cid”代表Truetype,“单字节”代表Type 1

Hovewer,我想这是库的错误,因为如果我想完全嵌入字体,我必须使用单字节模式。

  

嵌入TrueType(ttf)或TrueType集合(ttc)时,是一个子集   原始字体,仅包含使用的字形,嵌入   输出文件。这是默认值,但如果您指定   encoding-mode =“single-byte”(见上文),完整的字体是   嵌入