TCPDF 使用 PNG 在 Acrobat 中制作"An error exists on this page."



TCPF 6.0.099生成的某些PDF显示此错误,但仅在Acrobat 中显示:

此页面上存在错误。Acrobat 可能无法显示该页面 正确。请联系创建 PDF 文档的人员 更正问题。

该错误发生在某些包含.png图像的页面上,但并非所有带有图像的 PDF 都会生成错误。在Chrome中打开PDF就可以了,并且会显示图像。从页面中删除 .png 可防止此错误。php_errors日志中没有来自 TCPDF 的错误。

在我的本地主机上生成具有相同内容、相同代码和相同版本的 TCPDF 的 PDF 不会产生此 Acrobat 错误。我的本地服务器运行 OSX。Web 服务器运行 Centos 6.5。本地服务器和 Web 服务器都运行 PHP 5.5。

这些图像位于<img>标签中,这是写入PDF的一大块html的一部分,writeHTMLCell()使用src中的绝对URL进行。我通过pdfHarmony演示运行了Web服务器的PDF,它返回了两个与问题页面匹配的错误:

page: 004 Could not find the XObject named 'I2'.
page: 007 Could not find the XObject named 'I12'.

在本地的PDF上运行pdfHarmony根本没有返回任何错误。

我认为网络服务器可能对TCPDF的缓存文件夹存在权限问题,除了图像仍然显示在Chrome中。打开缓存权限没有效果。在tcpdf_config.php中为K_PATH_MAINK_PATH_URLK_PATH_CACHE设置路径没有效果。

出错的 PDF 大于没有错误的 PDF。(147k 与 109k(。文件之间的第一个差异(不是时间戳(是这样的:

  Webserver: /ColorSpace [/ICCBased 27 0 R]
  Localhost: /ColorSpace /DeviceGray 

这些差异出现在整个文件中。这篇博文说ICCBased并不是所有工具都支持,但我不知道这是否包括Acrobat,或者如何从TCPDF指定使用什么颜色空间。我知道TCPDF使用ImageMagick或GD来渲染.pngs。两台服务器都有imagick 3.1.2和GD版本"捆绑(2.1.0兼容("。我不知道是否有办法告诉TCPDF使用一个库而不是另一个库,或者如何判断它当前正在使用哪个库。

告诉我们的用户不要使用 .pngs 不是一种选择。也许可以将.png转换为不会导致此错误的其他格式。但是,为什么一台服务器生成带有错误的 PDF,而另一台服务器则没有?

我设置了一个问题的示例。

这是一个问题 png

这里将生成一个包含图像的 PDF(这将立即提示下载(

这是代码的重要部分:

$pdf->AddPage();
$html = '<img src="https://example.com/1.png">';
$pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);

我找到了针对我的问题的黑客修复程序,但我还没有找到问题的根源。 通过在TCPDF->ImagePngAlpha()末尾从生成的.png中删除alpha蒙版,我现在可以使用Acrobat 打开PDF。 我从$this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false);末尾删除了$imgmask

请参阅此固定 PDF 示例

我仍然不知道为什么这是Web服务器与本地主机的问题。在TCPDF->Image((中,我看到$info变量的两种不同结果一次TCPDF_IMAGES::$mtd($file(;被称为。

在 Web 服务器上:

array(11) {
  ["w"]=>
  int(183)
  ["h"]=>
  int(88)
  ["ch"]=>
  int(1)
  ["icc"]=>
  string(6936) "
}

在本地主机上:

array(11) {
  ["w"]=>
  int(183)
  ["h"]=>
  int(88)
  ["ch"]=>
  int(1)
  ["icc"]=>
  bool(false)
  ["cs"]=>
  string(10) "DeviceGray"
  ["bpc"]=>
  int(1)
  ["f"]=>
  string(11) "FlateDecode"
  ["parms"]=>
  string(75) "/DecodeParms << /Predictor 15 /Colors 1 /BitsPerComponent 1 /Columns 183 >>"
  ["pal"]=>
  string(0) ""
  ["trns"]=>
  string(0) ""
  ["data"]=>
  string(32) "H?c???c?!"
}

我不知道为什么我会得到这些差异,但至少我现在有一个很好的解决方案。 在这种情况下,我的 .png 不需要 alpha 掩码。

更新

我之前说的不需要口罩并不是真的。事实证明,我的一些 .png 确实需要它,但现在我有一个更好的修复方法。我注释掉了TCPDF->ImagePngAlpha((的整个ImageMagick部分,迫使它使用GD。

相关内容

最新更新