为什么 Apache Batik Rasterizer 无法正确渲染 TrueType 字体?

问题描述 投票:0回答:2

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

预期:

enter image description here

错误:

enter image description here

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

R A -> -660
T E -> -61

可能的解决方案:

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

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

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

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

svg fonts batik truetype
2个回答
2
投票

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

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与字体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 字体中的单个字符可能就是问题所在。


0
投票

Apache Batik ttf2SVG 可以将 True Type 字体转换为 SVG 文件。但它不是最好的,因为它忽略了很多要转换的 unicode 或字体组合。

但是使用font forge将ttf文件转换为SVG字体文件。

src: url('<SVG font file path> or <SVG font URL>#font ID') format('svg');

这里 font ID 是您可以在 SVG 字体文件中找到的 ID。

© www.soinside.com 2019 - 2024. All rights reserved.