为什么 Apache Batik Rasterizer 无法正确呈现 TrueType 字体?

Why does Apache Batik Rasterizer render TrueType font incorrectly?

我正在使用 Apache Batik rasterizer (Java, Oracle JRE 7 on Ubuntu) to convert a SVG into a PDF. The SVG contains text and references ttf fonts, which works well, but the font Diehl Deco 未按预期呈现:

预计:

不正确:

如您所见,"R" 流入 "A",因此字距调整未正确解释,因为字体本身包含此信息(感谢@Jongware 的评论):R A -> -660, T E -> -61

可能的解决方案:

1) 我想如果我们可以将 batik 的字体渲染引擎替换为使用 freetype,它就可以在我使用 freetype 的 Libre Office Writer 中正确渲染。

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

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

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

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

Batik 光栅器使用 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-faces 引用了字体。上面命令中的id与字体末尾的id相同url:#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 字符与 batik 光栅器不兼容。如果您的字体根本无法呈现 svg 字体中的单个字符,则可能是问题所在。