【发布时间】:2014-04-24 14:42:10
【问题描述】:
我无法理解,因此也解决了以下问题。我正在使用 Zend 框架 (Zend_Pdf) 使用绘图、字体和图像创建动态 PDF。问题在于图像。我正在嵌入 JPG,没有压缩,但它在 Adobe PDF Reader 中总是损坏。我尝试使用不同的图像 DPI,在嵌入之前缩放并存储图像,或者我保留原始大小并仅在嵌入 PDF 时对其进行缩放,但结果是相同的。我真的不明白出了什么问题或我还能尝试什么,所以我将不胜感激。
插入PDF的图片(original is here):
当我在任何浏览器(Chrome、FF、IE)中打开 pdf 时,它看起来不错,但在 Adobe PDF 阅读器中我得到了这个:
我标记了损坏的地方。 test.pdf can be seen here。谁能帮我理解这个问题?
编辑
经过进一步调试,这似乎与图像大小和Zend_Pdf::drawImage()方法有关。
根据我提供的坐标,PDF 中图像的预期大小应该是 168x120px,但是 PDF 中的实际大小要大得多。相差35%左右。
我相信这就是图像损坏的原因,但我仍然不明白应该使用什么坐标来显示所需的像素大小......基本上我正在使用这种模式:
$page->drawImage($image, $x, ($y - 120), ($x + 168), $y);
是不是坐标计算方法不对?
编辑 2:
我还添加了使用实际尺寸 (168x120px) 将已缩放图像嵌入到 PDF 中的示例,以显示 PDF 中的图像尺寸不同,或者至少似乎没有预期的尺寸,尽管我' m 使用上面的代码。缩放后的图像为here,最终的pdf为here。此缩放后的图像在调整大小之前已经具有白色边框,因此结果看起来更好。
编辑 3:
为了更详细地说明 PDF 中图像的所需像素大小。由于打印,我需要遵循一个布局。布局规范以 mm 为单位,我有图像必须定位的确切区域和最大宽度/高度。 IE。最大宽度为 100 毫米,我在 72ppi 文档中计算为 280 像素,与高度类似(42 毫米 = 119 像素)。还要求嵌入的图像必须为 300 DPI。而且我认为可能存在问题,但我仍然不明白我应该如何重新计算 PDF 的宽度/高度?还建议嵌入大图像并将其绘制得更小,还是使用缩放图像并以实际大小绘制? 我在屏幕上使用 72DPI 的图像看到了更好的结果,所以我是否可能需要创建 2 个 PDF 文件,一个仅用于打印,一个仅用于屏幕或浏览器?
编辑 4(打印):
我测试了 300 和 600 DPI 的打印效果。在 PDF (this one) 中绘制时使用全尺寸图像的 PDF 在这两种情况下都可以。 scaled.pdf 在 300 DPI 打印中非常糟糕(甚至在边缘可以看到一些红色)。它在 600 DPI 打印中相当不错,但由于拉伸而非常模糊。并且拉伸是由于绘制时图像的点大小错误造成的,正如我前面提到的。
【问题讨论】:
-
我认为这些只是Adobe工具平滑算法的产物。
-
我在 Apple 的 Preview 中看到了同样的情况(诚然,这不是最强大的 PDF 查看器)。公平地说:在提取 JPEG 并以合理的大小查看它之后——任何小于 100% 的东西——预览也会显示伪影。如果您在其周围包含 1 或 2 个白色像素边框,可能会对渲染器有所帮助。
-
是的,感谢您的提示。我忘了说,在图像周围添加 5px 白色边框修复了 S 和 A 顶部的问题,但是 Y 的顶部和底部仍然不好。我也可以在缩放时重现 IE 和 Firefox 中的问题,所以我认为嵌入图像的大小确实存在问题,它不成比例(不尊重纵横比)
-
不,嵌入的图像完全相同大小相同;我直接从您的 PDF 中提取了用于测试的 JPEG。请记住,PDF 不能以“100% 在屏幕上”显示光栅图像;它总是会对其进行重新采样,以将 PDF 中的“所需尺寸”重新调整为“为 your 屏幕缩放”(其中“your”是一个高度相关的概念;我的“屏幕 100%”与您的不同)。
-
您还可以检查您的 Adobe Acrobat/Reader 的首选项。有一个设置可以设置屏幕分辨率。现在很可能是 108 ppi 左右。对于一个实验,将其更改为 72 ppi,然后查看结果。这也可以解释为什么通过将图像缩放 0.66 可以获得更好的结果。一个很好的折衷方案是缩放图像(在图像处理器中),以便在 100% 视图下获得大约 108 ppi 的分辨率。
标签: pdf adobe-reader zend-pdf