使用嵌入字体将SVG嵌入PDF
我希望将SVG图像嵌入到PDF中,并使用正确的字体呈现SVG使用嵌入字体将SVG嵌入PDF,pdf,svg,fonts,pdf-generation,tcpdf,Pdf,Svg,Fonts,Pdf Generation,Tcpdf,我希望将SVG图像嵌入到PDF中,并使用正确的字体呈现SVGtext元素中指定的字体系列 我使用的字体是 下面是我用来将字体转换为TCPDF“本机格式”的代码: 下面是我用来生成带有嵌入式SVG的测试PDF的代码: $svg_content = '<svg width="600px" height="800px">'; foreach ($variants as $key => $variant) { $svg_content .= '<text x="30" y
text
元素中指定的字体系列
我使用的字体是
下面是我用来将字体转换为TCPDF“本机格式”的代码:
下面是我用来生成带有嵌入式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'
);
然后,所有文本都以Lato-Black呈现:
在我看来,字体似乎嵌入到PDF中,但是SetFont
显然为后续PDF文本元素设置了当前字体,SVG图像中的text
元素使用此字体进行渲染
我期望的行为是,在PDF中尊重SVGtext
元素上定义的font-family
属性,以便每一行使用行末尾括号中提到的字体变量进行渲染
我怎样才能做到这一点?您可以从以下代码开始,并反向合并您的更改 明确地说,我并不是特别提倡这样做,只是这是一种可行的方法,因此应该作为一个起点 字体转换器:
$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(dirname(__FILE__) . '/fonts/Lato-' . $variant . '.ttf', 'TrueTypeUnicode', '', 96);
}
echo 'Done!';
这将.php
、.z
和.ctg.z
文件放在/tecnickcom/tcpdf/font
中
PDF生成器:
$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(dirname(__FILE__) . '/fonts/Lato-' . $variant . '.ttf', 'TrueTypeUnicode', '', 96);
}
echo 'Done!';
注意$variants
数组中不同的字体系列
名称:
$variants = [
'lato',
'latob',
'latobi',
'latoblack',
'latoblacki',
'latohairline',
'latohairlinei',
'latoheavy',
'latoheavyi',
'latoi',
'latolight',
'latolighti',
'latomedium',
'latomediumi',
'latosemib',
'latosemibi',
'latothin',
'latothini'
];
$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="\'' . $variant . '\'" text-anchor="start">The quick brown fox jumped over the lazy dog (' . $variant . ').</text>';
}
$svg_content .= '</svg>';
ob_start();
$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('latoblack', '', dirname(__FILE__) . '/fonts/output/latoblack.php');
$pdf->ImageSVG('@' . $svg_content, 0, 0, 300, 300, '', $align='', $palign='C', $border=0, false);
$pdf->Output('example_001.pdf', 'I');
$variants=[
“拉托”,
“拉托布”,
“拉托比”,
“拉托布拉克”,
“latoblacki”,
“拉托航空公司”,
“latohairlinei”,
“latoheavy”,
“latoheavyi”,
"拉托伊",,
“latolight”,
“拉托利蒂”,
“latomedium”,
“latomediumi”,
“latosemib”,
“latosemibi”,
“拉托辛”,
“拉托西尼”
];
$svg_content='';
foreach($key=>$variant的变体){
$svg_content.=“敏捷的棕色狐狸跳过了懒狗(“$variant”);
}
$svg_内容='';
ob_start();
$pdf=新的TCPDF();
$pdf->SetPrintHeader(假);
$pdf->SetPrintFooter(false);
$pdf->setImageScale(pdf图像比例);
$pdf->SetMargins(0,0,-1,true);
$pdf->SetAutoPageBreak(false,0);
$pdf->AddPage();
//$pdf->AddFont('latoblack','',dirname('uuuu FILE.'.')/fonts/output/latoblack.php');
$pdf->ImageSVG('@'.$svg_content,0,0,300,300',,$align='',$palign='C',$border=0,false);
$pdf->Output('example_001.pdf','I');
输出:
$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(dirname(__FILE__) . '/fonts/Lato-' . $variant . '.ttf', 'TrueTypeUnicode', '', 96);
}
echo 'Done!';
仅仅因为文件名为“Lato BoldItalic”,并不意味着您应该在SVG中引用它。您是否尝试过仅使用
font family=“Lato”
?如果我认为这是可行的,那么您可以使用CSS中的常规方式生成所有变体-font-weight
和font-style
。是的,我已经尝试过了。这似乎没有什么区别——只有在SVG上下文之外调用TCPDFSetFont()
方法时,字体才会改变。我想知道我是不是错过了一步。太好了,谢谢。我已经能够生成一个PDF,现在可以正确呈现字体。阅读了你的答案后,我的主要问题是如何将我的字体放在自定义目录中。一旦我纠正了这一点,我实际上发现使用像'Lato-Black'
这样的变体名称确实有效-除了'Lato-Semibold'
,这会导致错误:TCPDF错误:无法包含字体定义文件:latosemi
。我不确定它为什么要查找名为latosemi
的文件-我看不到对它的引用。知道为什么吗?不确定,但是latosemi
应该是latosemib
。听起来像是个打字错误latosemib
没有为我生成任何错误