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

标签 svg fonts batik truetype

我正在使用Apache Batik rasterizer (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,它就可以正常工作,因为它可以在我使用 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/

相关文章:

javascript - Fabric.js 基于svg的多重裁剪

html - SVG 背景图像不在中心旋转

html - HTML/CSS 中 LI 工具栏中的自定义图像

html - 我如何检查谷歌字体请求的来源?

javascript - SVG "z-index"解决方法

c++ - 如何使用 freetype 从 "Segoe UI Emoji"渲染彩色字形?

ios - UILabel 在使用文本设置属性时显示自定义字体错误,但在代码中设置时工作正常

java - 我可以只使用 Batik 库的转码器而不使用所有其他 Batik 代码和依赖项吗?

java - 在Java中读取SVG路径

java - JSVGCanvas.getSVGDocument() 返回 null?