php - TCPDF 在 Acrobat 中使用 PNG 生成 "An error exists on this page."

标签 php pdf png tcpdf

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

An error exists on this page. Acrobat may not display the page correctly. Please contact the person who created the PDF document to correct the problem.

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

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

图像位于 <img>标签,使用 writeHTMLCell() 写入 PDF 的一大块 html 的一部分在 src 中使用绝对 url 。我通过pdfHarmony demo运行了网络服务器的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_MAIN 的路径, K_PATH_URL ,和K_PATH_CACHE没有效果。

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

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

这些差异出现在整个文件中。 This blog post说并非所有工具都支持 ICCBased,但我不知道这是否包括 Acrobat,也不知道如何从 TCPDF 指定要使用的色彩空间。我知道 TCPDF 使用 ImageMagick 或 GD 来渲染 .png。两台服务器都有 imagick 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);

最佳答案

我找到了解决问题的方法,但我还没有找到问题的根源。通过从 TCPDF->ImagePngAlpha() 末尾生成的 .png 中删除 Alpha mask ,我现在可以使用 Acrobat 打开 PDF。我从 $this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize) 的末尾删除了 $imgmask , $dpi, $palign, false);

See this example of a fixed PDF

我仍然不知道为什么它是网络服务器与本地主机上的问题。在 TCPDF->Image() 中,我看到 $info var 一次 TCPDF_IMAGES::$mtd($file); 出现两个不同的结果被调用。

在网络服务器上:

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 mask 。

更新

我之前说的不需要口罩的说法并不正确。事实证明我的一些 .png 确实需要它,但我现在有了更好的解决方案。我注释掉了 TCPDF->ImagePngAlpha() 的整个 ImageMagick 部分,强制它使用 GD。它有效!

关于php - TCPDF 在 Acrobat 中使用 PNG 生成 "An error exists on this page.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259273/

相关文章:

pdf - FEFF0009 的/ActualText 在 PDF 中是什么意思?

java - Selenium:保存在新浏览器中打开的没有 url 的 pdf

c++ - 使用 boost.gil 逐像素读取 .png 文件

java - 如何在 Java 中将 TIF 转换为 PNG?

javascript - 当用户使用 Facebook SDK for JavaScript 在 Facebook 上分享帖子时如何更新 mysql 中的数据

php - 与 Laravel 和 Eloquent 的三向关系

php - 在网页上记录,保存和播放保存的声音文件

php - 在sql中添加两列的值

php - 将获取的数据转换并显示为 Bamini 格式

c# - .Net 中的位图保存是否以不正确的格式保存图像?