为什么Apache Batik Rasterizer会错误地呈现TrueType字体?

时间:2015-08-28 13:58:06

标签: svg fonts batik true-type-fonts

我正在使用Apache Batik rasterizer(Java,Oracle JRE 7在Ubuntu上)将SVG转换为PDF。 SVG包含文本和引用ttf字体,效果很好,但字体Diehl Deco无法按预期呈现:

预期:

enter image description here

不正确:

enter image description here

正如您所看到的那样,“R”流入“A”,因此字距本身不包含此信息(对于来自@Jongware的评论),因此无法正确解释字距:R A -> -660,{{ 1}}

可能的解决方案:

1)我认为如果我们可以交换蜡染的字体渲染引擎来使用freetype它可以正常工作,因为它在我的Libre Office Writer中正确呈现,它使用了freetype。

2)我可以将ttf字体转换为SVG字体,在这种SVG到PDF光栅化的情况下可以更好地工作。但到目前为止我还没有成功。

3)如果有任何工具支持,我可以将SVG内的字体转换为路径。

非常欢迎任何评论或其他解决方案!谢谢!

1 个答案:

答案 0 :(得分:1)

找到值得分享的解决方案:

Batik rasterizer使用AWT GlyphVector(Java)进行字体渲染,它似乎无法正确渲染字距 - 至少对于这种字体。

通过batik ttf2svg将ttf字体转换为svg字体,我按预期工作了。其他工具不起作用 - 至少与蜡染光栅化器结合使用。

我使用以下命令转换字体:

java -jar /path/to/batik/batik-1.8/batik-ttf2svg-1.8.jar diehl_deco.ttf -o diehl_deco.svg -id DiehlDeco -l 32 -h 20000`

在我的输入svg中转换为pdf我通过@ font-faces引用了字体。上述命令中的id与字体url末尾的id相同:#DiehlDeco

<defs><style type="text/css"><![CDATA[
    @font-face { 
        font-family: 'diehl_deco';
        src: url('https://path/to/diehl_deco.svg#DiehlDeco') format('svg');
        font-weight: normal;
        font-style: normal;
    }
]]></style></defs>

选项-l 32至关重要 - 至少对于此字体 - 因为前32个unicode字符与蜡染光栅化器不兼容。如果您的字体根本不呈现svg字体中的单个字符可能是问题。