https 上的 mpdf 损坏图像

mpdf broken images over https

我正在使用 mpdf 生成 pdf。一切都很好,直到我切换到 https。之后,pdf 仍能正确生成,但图像已损坏。他们的来源在 php 模板上使用 https 协议正确编写。而且我也尝试只使用相对路径。没有。

以下是我的示例代码 class:

  public function save_pdf($translate = false){
    $this->mpdf = new \Mpdf\Mpdf();
    $this->mpdf->CSSselectMedia='mpdf';
    //$this->mpdf->showImageErrors = true; // this will log errors into the php log file

    $ch = curl_init($this->pdf_css_path . '/configurator-pdf.css');
    // this disables ssl check: unsafe
    if($this->disable_ssl_check) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $css = curl_exec($ch);
    curl_close($ch);

    $template = ($translate) ? $this->pdf_template_url : $this->pdf_template_url_it;
    $filename = ($translate) ? $this->pdf_name : $this->pdf_it_name;
    $_POST['cid'] = $this->cid;

    $json = json_encode($_POST);

    $ch = curl_init($template);
    // this disables ssl check: unsafe
    if($this->disable_ssl_check) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json) ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    $html = curl_exec($ch);
    curl_close($ch);

    $this->mpdf->WriteHTML($css, 1);
    $this->mpdf->WriteHTML($html, 2);

    $pdf = $this->pdf_destination_path . DS . $filename;
    $this->mpdf->Output($pdf, \Mpdf\Output\Destination::FILE);
  }

在这里找到解决方案:

我们可以这样设置

//note: using $this only because in my case mpdf is a class prop
$this->mpdf->curlAllowUnsafeSslRequests = true;

它会自动解决,至少对于我上面的程序是这样。显然,这不是 'secure' 解决方案,尤其是当图像 and/or 内容为 unknown/unpredictable 时。您应该努力获得工作证书。两篇关于证书设置的好文章是:

https://welaunch.io/plugins/woocommerce-pdf-catalog/faq/images-pdf-displays-red-cross-https-mpdf/

https://medium.com/@f.h.ferreira/file-get-contents-ssl-operation-failed-php-4297ad92977f

这最后还特别提供了 https://curl.haxx.se/ 及其证书的链接。不过我没有测试。

我在 mpdf class 函数中找到 file_get_contents_by_curl。 在 curl_init 函数后添加这两行。

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

保存 mpdf 后工作正常,图像没有问题。

这个问题有点老了(我坚持使用 atm 的 mpdf 版本也是如此),但是最近有另一个答案,对我来说 none 现有的答案有效(website/server有效的 SSL 证书和相对路径不成功)。

幸运的是,我的 pdf 中只有 2 个静态图像,我直接控制 HTML,所以我通过将图像转换为 base64 解决了我的问题(使用 https://www.base64-image.de/), 而不是链接到它们。

这不是一个理想的解决方案,但却是一个有效的解决方案 none不过,所以我想我会把它放在这里以防其他人需要快速修复。

curlAllowUnsafeSslRequests 没有帮助我。但我发现图像变量即使在 https 上也能正常工作..

https://mpdf.github.io/what-else-can-i-do/images.html#image-data-as-a-variable

本质上,您在模板之外获取图像文件的内容,然后将其作为变量传递到那里:

$mpdf->imageVars['myvariable'] = file_get_contents('alpha.png');

在模板中:

<img src="var:myvariable" />