TCPDF将带有html的嵌入式SVG转换为PDF

vin*_*ini 2 php pdf svg pdf-generation tcpdf

我正在使用TCPDF将html转换为PDF。

    $pdf = new TCPDF();
    $pdf->SetPrintHeader(false);
    $pdf->SetPrintFooter(false);
    $pdf->AddPage();       

    $html  = '<div>Some random html </div>';        
    $pdf->writeHTML($html, true, false, true, false, '');
    $pdf->Output('/pdf/output.pdf','F');
Run Code Online (Sandbox Code Playgroud)

它像一种魅力。

但是我有一种情况,当(Dynamic)html也有SVG内联代码时。因此,我需要将具有SVG的html转换为PDF。但这行不通。下面是我的代码。

    $pdf = new TCPDF();
    $pdf->SetPrintHeader(false);
    $pdf->SetPrintFooter(false);
    $pdf->AddPage();       

    $html  = '<div>Some random html <div style="width: 100px;"><svg viewBox="10 0 80 80">
    <ellipse cx="240" cy="100" rx="220" ry="30" style="fill:purple" />
    <ellipse cx="220" cy="70" rx="190" ry="20" style="fill:lime" />
    <ellipse cx="210" cy="45" rx="170" ry="15" style="fill:yellow" />
    Sorry, your browser does not support inline SVG. 
    </svg></div> </div>';        
    $pdf->writeHTML($html, true, false, true, false, '');
    $pdf->Output('/pdf/output.pdf','F');
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,生成的PDF的所有html都以pdf打印,但是代替SVG时,它会显示“抱歉,您的浏览器不支持嵌入式SVG”。

有没有可能从包含SVG的html生成PDF?

更新,我发现http://www.pdfy.net/ 这个网站可以将基于html的svg转换为PDF。知道他们如何做吗?

编辑1:

好的,现在我发现mPDF支持内联SVG。它对此确实有很大的支持。但是 mPDF有它自己的问题,即对基本CSS的支持很少。例如 绝对位置,浮动不很好支持。

所以我再次遇到相同的问题,但有其他要求。一个支持内联svg的html到PDF转换的库,它还支持所有基本的CSS。

Sor*_*ush 5

解决方案#1-保存svg到文件

您可以将自己的svg一部分保存HTML到文件中。然后,您可以按照此处所说的功能将svg图像添加到PDF中。$pdf->ImageSVG()

$pdf->ImageSVG($file='path/to/testsvg.svg', $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);

$pdf->Write(0, $txt='', '', 0, 'L', true, 0, false, false, 0);
Run Code Online (Sandbox Code Playgroud)

解决方案2-内联添加 svg

您可以将内联存储svg到变量中(例如$svgString):

$svgString = '<svg viewBox="10 0 80 80">
<ellipse cx="240" cy="100" rx="220" ry="30" style="fill:purple" />
<ellipse cx="220" cy="70" rx="190" ry="20" style="fill:lime" />
<ellipse cx="210" cy="45" rx="170" ry="15" style="fill:yellow" />
Sorry, your browser does not support inline SVG. 
</svg>';
Run Code Online (Sandbox Code Playgroud)

然后,您可以将$svgString变量添加到PDF中,如下所示:

$pdf->ImageSVG('@' . $svgString, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false);

$pdf->Write(0, $txt='', '', 0, 'L', true, 0, false, false, 0);
Run Code Online (Sandbox Code Playgroud)