提问者:小点点

为什么Apache Batik Rasterizer不正确地呈现TrueType字体?


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

预期:

不正确:

如您所见,“R”流入“A”,因此字距调整未正确解释,因为字体本身包含此信息(感谢来自@Jongware的评论):R A-

可能的解决方案:

1)我想如果我们可以交换蜡染的字体渲染引擎来使用freetype,它可以在我的Libre Office Writer中正确渲染,它使用freetype。

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

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

任何意见或其他解决方案都非常欢迎!谢谢!


共1个答案

匿名用户

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

蜡染光栅化器使用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`

在我输入的转换为pdf的svg中,我通过@font-face引用了字体。上面命令中的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字体中的单个字符可能是问题所在。