【发布时间】:2017-08-13 22:56:22
【问题描述】:
我想将 SVG 图像嵌入 PDF,并使用正确的字体呈现 SVG text 元素中指定的字体系列。
我使用的字体是'Lato' TTF fonts。
这是我用来将字体转换为 TCPDF 的“原生格式”的代码:
$variants = [
'Black',
'BlackItalic',
'Bold',
'BoldItalic',
'Hairline',
'HairlineItalic',
'Heavy',
'HeavyItalic',
'Italic',
'Light',
'LightItalic',
'Medium',
'MediumItalic',
'Regular',
'Semibold',
'SemiboldItalic',
'Thin',
'ThinItalic',
];
foreach ($variants as $variant) {
\TCPDF_FONTS::addTTFfont(
'/var/www/fonts/Lato-' . $variant . '.ttf',
'',
'',
32,
'/var/www/fonts/output/'
);
}
这是我用来生成带有嵌入式 SVG 的测试 PDF 的代码:
$svg_content = '<svg width="600px" height="800px">';
foreach ($variants as $key => $variant) {
$svg_content .= '<text x="30" y="' . ( 30 * ( $key + 1 ) ) . '" fill="#ED6E46" font-size="20" font-family="\'Lato-' . $variant . '\'" text-anchor="start">The quick brown fox jumped over the lazy dog (' . $variant . ').</text>';
}
$svg_content .= '</svg>';
$pdf = new TCPDF();
$pdf->SetPrintHeader(false);
$pdf->SetPrintFooter(false);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->SetMargins(0, 0, -1, true);
$pdf->SetAutoPageBreak(false, 0);
$pdf->AddPage();
$pdf->AddFont('Lato-Black', '', '/var/www/fonts/output/latoblack.php');
$pdf->ImageSVG('@' . $svg_content, 0, 0, 300, 300, '', $align='', $palign='C', $border=0, false);
$pdf->Output(
preg_replace('/[^A-Za-z0-9]/', '', $influencer->getName()) . '.pdf',
'I'
);
我得到的结果是所有文本都以我认为是 Helvetica 的方式呈现:
如果我在调用 ImageSVG() 之前添加一行,如下所示:
$pdf->SetFont('Lato-Black', '', null, '/var/www/fonts/output/latoblack.php');
然后所有的文本都用 Lato-Black 渲染:
在我看来,字体可以很好地嵌入 PDF,但 SetFont 显然为后续 PDF 文本元素设置了当前字体,而 SVG 图像中的 text 元素使用此字体呈现。
我希望的行为是在 PDF 中尊重 SVG text 元素上定义的 font-family 属性,以便每一行使用行尾括号中提到的字体变体呈现。
我该怎么做?
【问题讨论】:
-
仅仅因为该文件被称为“Lato-BoldItalic”,并不意味着您应该在 SVG 中引用它。您是否尝试过仅使用
font-family="Lato"?如果这如我所怀疑的那样有效,那么您可以使用 CSS 中的正常方式生成所有变体 -font-weight和font-style。 -
是的,我试过了。它似乎没有任何区别 - 只有当我在 SVG 上下文之外调用 TCPDF
SetFont()方法时,字体才会发生变化。我想知道我是否在某个地方遗漏了一步。
标签: pdf svg fonts pdf-generation tcpdf