Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用嵌入字体将SVG嵌入PDF_Pdf_Svg_Fonts_Pdf Generation_Tcpdf - Fatal编程技术网

使用嵌入字体将SVG嵌入PDF

使用嵌入字体将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

我希望将SVG图像嵌入到PDF中,并使用正确的字体呈现SVG
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中尊重SVG
text
元素上定义的
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上下文之外调用TCPDF
SetFont()
方法时,字体才会改变。我想知道我是不是错过了一步。太好了,谢谢。我已经能够生成一个PDF,现在可以正确呈现字体。阅读了你的答案后,我的主要问题是如何将我的字体放在自定义目录中。一旦我纠正了这一点,我实际上发现使用像
'Lato-Black'
这样的变体名称确实有效-除了
'Lato-Semibold'
,这会导致错误:
TCPDF错误:无法包含字体定义文件:latosemi
。我不确定它为什么要查找名为
latosemi
的文件-我看不到对它的引用。知道为什么吗?不确定,但是
latosemi
应该是
latosemib
。听起来像是个打字错误
latosemib
没有为我生成任何错误