我正在使用 Apache Batik 光栅化器(Ubuntu 上的 Java、Oracle JRE 7)将 SVG 转换为 PDF。 SVG 包含文本和引用 ttf 字体,效果很好,但字体 Diehl Deco 未按预期呈现:
预期:
错误:
正如您所看到的“R”流入“A”,因此字距调整未正确解释,因为字体本身包含此信息(感谢@Jongware的评论):
R A -> -660
,T E -> -61
可能的解决方案:
1) 我认为如果我们可以将 batik 的字体渲染引擎替换为使用 freetype,它就可以正常工作,因为它可以在我的 Libre Office Writer(使用 freetype)中正确渲染。
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与字体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 字体中的单个字符可能就是问题所在。
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。