我正在使用Apache Batik rasterizer(Java,Oracle JRE 7在Ubuntu上)将SVG转换为PDF。 SVG包含文本和引用ttf字体,效果很好,但字体Diehl Deco无法按预期呈现:
预期:
不正确:
正如您所看到的那样,“R”流入“A”,因此字距本身不包含此信息(对于来自@Jongware的评论),因此无法正确解释字距:R A -> -660
,{{ 1}}
可能的解决方案:
1)我认为如果我们可以交换蜡染的字体渲染引擎来使用freetype它可以正常工作,因为它在我的Libre Office Writer中正确呈现,它使用了freetype。
2)我可以将ttf字体转换为SVG字体,在这种SVG到PDF光栅化的情况下可以更好地工作。但到目前为止我还没有成功。
3)如果有任何工具支持,我可以将SVG内的字体转换为路径。
非常欢迎任何评论或其他解决方案!谢谢!
答案 0 :(得分:1)
找到值得分享的解决方案:
Batik rasterizer使用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`
在我的输入svg中转换为pdf我通过@ 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字体中的单个字符可能是问题。