TCPDF 嵌入 HTML 字符串中的 Base64 编码图像

问题描述

我已经阅读了几篇关于这个主题的帖子,但不想在其中提出其他问题。

特别是这篇文章TCPDF and insert an image base64 encoded

我正在 wordpress自定义主题生成 PDF。我使用的是 TCPDF 6.2.3(我相信是最新的稳定版本)。

我正在从用于在页面显示的相同 HTML 构建此 PDF。如果我嵌入完整的 base64 编码字符串,它可以在浏览器中正常工作,但 PDF 中缺少图像。

如果我使用链接帖子中描述的“@”方法,我会在浏览器中看到一个损坏的图像(预期),但在 PDF 中仍然没有。

我其余的 HTML 标记都在 PDF 中呈现,只是没有显示图像。

我是否需要设置一些其他设置或选项才能使图像显示在 PDF 中,和/或您能发现我在这里做错了什么吗?没有错误,只是在 PDF 中看不到图像。

这是我设置图像的方式:

        $imageLocation = $img_root.$imgsrc;
        $ext = end(explode(".",$imageLocation));
        $image = base64_encode(file_get_contents($imageLocation));

        //$response .= "<img src='data:image/$ext;base64,$image'>"; //works in browser but not in PDF
        $response .= "<img src='@$image' class='socf_image'>"; //does not work in browser or PDF

这里是创建PDF的方法

function createPDF($response)
{
    // Include the main TCPDF library (search for installation path).
    require_once('tcpdf_6_3_2/tcpdf/tcpdf.PHP');

    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,PDF_PAGE_FORMAT,true,'UTF-8',false);

    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('test');
    $pdf->SetTitle('test');
    $pdf->SetSubject('test');
    $pdf->SetKeywords('test');

    // set default header data
    $pdf->SetHeaderData(PDF_HEADER_logo,PDF_HEADER_logo_WIDTH,PDF_HEADER_TITLE.' 001',PDF_HEADER_STRING,array(0,64,255),128));
    $pdf->setFooterData(array(0,0),128));

    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN,'',PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA,PDF_FONT_SIZE_DATA));

    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    // set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT,PDF_MARGIN_TOP,PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

    // set auto page breaks
    $pdf->SetAutopageBreak(TRUE,PDF_MARGIN_BottOM);

    // set image scale factor
    $pdf->setimageScale(PDF_IMAGE_SCALE_RATIO);

    // set default font subsetting mode
    $pdf->setFontSubsetting(true);

    // Set font
    $pdf->SetFont('helvetica',14,true);

    // Add a page
    $pdf->AddPage();
    
    $html = $response;
    $pdf->writeHTML($response,false,'');
    
    return $pdf;

}

解决方法

好吧,幸运的是,我能够自己解决这个问题。也许这不是寻求该库帮助的最佳论坛?如果有人能建议一个更好的地方来寻求帮助,我会很感激的。

最终,问题有两个方面:

  1. PDf 需要“@”符号,而该方法适用于在浏览器中显示 HTML。因此,在创建 PDF 之前替换字符串可以解决这个问题。
  2. 这是棘手的部分。 HTML 需要在属性周围使用双引号,而不是单引号。我的代码对 PHP 字符串使用双引号,因此 HTML 属性用单引号括起来,这就是问题所在。交换两种引用类型是使图像出现在 PDF 中的最后一个难题。

希望这能帮助那些像我一样盲目地在图书馆中寻找出路的人。