TCPDF 在具有单个字体文件时忽略 $pdf->ImageSVG() 中的内联字体粗细和字体样式

TCPDF ignores inline font-weight and font-style in $pdf->ImageSVG() when having single font file

我有以下 svg:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="600" height="450" viewBox="0 0 600 450" xml:space="preserve">
  <g transform="translate(300 77)">
    <text xml:space="preserve" font-family="Slabo-Regular" font-size="40" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;"><tspan x="-44.44" y="12.57">Slabo</tspan></text>
  </g>
  <g transform="translate(300 230)">
    <text xml:space="preserve" font-family="Slabo-Regular" font-size="40" font-style="normal" font-weight="bold" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;"><tspan x="-44.44" y="12.57">Slabo</tspan></text>
  </g>
  <g transform="translate(300 389)">
    <text xml:space="preserve" font-family="Slabo-Regular" font-size="40" font-style="italic" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;"><tspan x="-44.44" y="12.57">Slabo</tspan></text>
  </g>
</svg>

第 1 行以常规 "Slabo" 书写,第 2 行具有字体粗细 "bold",第 3 行具有字体样式 "italic"。

但是,当我使用名为 ImageSVG() 的 TCPDF 方法将此 svg 转换为 pdf 时,我得到了所有以常规 "Slabo" 编写的行。这是一个带有单个文件的字体的测试用例(如果我对每种字体变体有不同的文件,我知道该怎么做)。

似乎 TCPDF 忽略了内联字体粗细和字体样式。

这是预期的行为还是我做错了什么?

据我所知,TCPDF 不会近似字体粗体或斜体样式。也就是说,它不会尝试近似一种字体 style/weight 它不会像您的浏览器那样动态显示。

如果您不想修改 SVG 或使用 ImageMagick 栅格化它们,我知道您有两个选择:

1) 提供其他字体作为您没有的 Slabo 样式的填充

这个选项可能是最简单的。由于 Slabo 只有常规 weight/style 可用,您可以选择非常相似的替代字体,然后重命名它们的文件,以便它们匹配 TCPDF 对 Slabo 其他样式的命名规则。

$slabo = TCPDF_FONTS::addTTFfont(realpath('./slabo/Slabo-Regular.ttf'), 'TrueTypeUnicode', '', 32);
//Regular
$slaboi = TCPDF_FONTS::addTTFfont(realpath('Slabo-Italic.ttf'), 'TrueTypeUnicode', '', 32); 
//Italic
$slabob = TCPDF_FONTS::addTTFfont(realpath('Slabo-bold.ttf'), 'TrueTypeUnicode', '', 32); 
//Bold
$slabobi = TCPDF_FONTS::addTTFfont(realpath('slabobi.ttf'), 'TrueTypeUnicode', '', 32); 
//Bold and Italic (file could have also been named something like Slabo-Bold-Italic.ttf)

TCPDF 将在 SVG 解析器处理文本元素时找到这些其他字体。 (对于粗体示例:在内部,Slabo-Regular 将更改为 slabo,然后因为您想要粗体,它会查找存在的 slabob,然后将使用该字体.)

下面是一个使用替代字体的例子。 (没有仔细挑选。)

2) 生成近似的 bold/italic 样式。

您可以创建自己的 Slabo 样式。例如,使用像 FontForge

这样的工具

http://designwithfontforge.com/en-US/Bold_and_Other_Weights.html

Creating a bold version of a font can be rapidly approximated by running a filter called Change weight (which you will find in the Element > Styles menu) to add weight to your glyphs.