TCPDF生成“此页面上存在错误”。在Acrobat中使用PNG

时间:2014-12-02 21:26:07

标签: php pdf png tcpdf

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

  

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

使用.png图像的某些页面上会出现错误,但并非所有带图像的PDF都会生成错误。在Chrome中打开PDF很好,并显示图像。从页面中删除.png可以防止错误。 php_errors日志中的TCPDF没有错误。

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

图片位于<img>标签中,是writeHTMLCell()使用src中的绝对网址写入PDF的大部分html的一部分。我通过pdfHarmony demo运行了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 vs 109k)。文件之间的第一个差异(不是时间戳)是:

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

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

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

实施例

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

Here is a problem png

Here a PDF will be generated that includes the image(这将立即提示下载)

以下是代码的重要部分:

$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);

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的黑客方法,但我还没有找到问题的根源。通过从TCPDF->ImagePngAlpha()末尾生成的.png中删除alpha掩码,我现在可以使用Acrobat打开PDF。我从$imgmask

的末尾删除了$this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false);

See this example of a fixed PDF

我仍然不知道为什么Web服务器与localhost存在问题。在TCPDF-&gt; Image()中,一旦TCPDF_IMAGES :: $ mtd($ file),我会看到$ info var的两个不同结果;被称为。

在网络服务器上:

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

在localhost上:

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?!"
}

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

更新

之前我所说的不需要面具的事情并非如此。结果我确实需要它为我的一些.pngs,但我现在有一个更好的解决方案。我注释掉了TCPDF-> ImagePngAlpha()的整个ImageMagick部分,迫使它使用GD。它有效!