我正在使用Apache Batik rasterizer (Ubuntu 上的 Java、Oracle JRE 7)将 SVG 转换为 PDF。 SVG 包含文本并引用 ttf 字体,效果很好,但字体 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将ttf字体转换为svg字体,使其按预期工作ttf2svg 。其他工具不起作用 - 至少与 batik 光栅化器结合使用。
我使用以下命令来转换字体:
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 字符与 batik 光栅化器不兼容。如果您的字体根本无法渲染,则 svg 字体中的单个字符可能就是问题所在。
关于svg - 为什么 Apache Batik Rasterizer 无法正确渲染 TrueType 字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272822/