PDF尺寸与实际内容尺寸的区别

3
我目前正在使用php的imagick将一些PDF转换为图片 - 这很好用,但输出时图片会被“切割”。
这是由于PDF中所包含的信息与实际内容尺寸之间的差异造成的。
PDF报告为612x792 72ppi文档,但当我通过Mac上的预览导出图像时,图像为1651x1275 - 这怎么可能呢?
显然,导出是正确的,因为图像在这些尺寸下可以正确查看 - PDF是否只是编码错误,宽度和高度被混淆了?我该如何通过代码检测此问题?此外,图像导出的大小也不同(大得多),大约是原始PDF的两倍,这让我相信imagick并没有正确读取某些信息。
基本上,我想知道是否有一种正确的方法来确定实际的PDF内容大小,以便从中导出的图像具有最佳质量。
谢谢!
编辑:(添加代码)
<?php
$im = new Imagick();
$im->readImage("SomeTest.pdf");
$im->setImageColorspace(255);
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(60);
$im->setImageFormat('jpeg');
$im->writeImages("SampleImage.jpg");
?>

使用的PDF文件如下: http://www.pantone.com/pages/MYP_mypantone/software_downloader.aspx?f=3

此外,以下是imagick从identifyImage()函数输出的结果,看起来文件大小有些不对。

Array
(
    [imageName] => /tmp/magick-XXehkI8e
    [format] => PDF (Portable Document Format)
    [geometry] => Array
        (
            [width] => 612
            [height] => 792
        )

    [type] => TrueColor
    [colorSpace] => RGB
    [resolution] => Array
        (
            [x] => 72
            [y] => 72
        )

    [units] => Undefined
    [fileSize] => 50mb
    [compression] => Undefined
    [signature] => 9426f3fc4f45afd71941435a37d585d01e01d32458f3ca241e72892c2f7f35d5
)

一切似乎都很好,直到你看到文件大小。那真的很可疑。 - Mark Storer
每当您使用ImageMagick将PDF转换为图像时,请务必将“-density”参数设置为正确的DPI,否则质量和大小将会很差。 - Orbling
Mark,图像大小实际上不起作用 - 在imagick中创建了一个明显的图像数组,我需要弄清楚它们,以便在将它们写出之前设置每个图像的大小。 - TeckniX
2个回答

3
请注意,PDF本身是一种无分辨率的格式。页面的描述方式是数学方式,不受任何特定分辨率限制的约束,除了那些由浮点数所强加的限制。
只有当PDF被呈现到特定设备上时(这可能或可能不是在该设备的分辨率下),它才真正具有分辨率。
“但图片呢?PDF里的图像肯定会给它带来分辨率!” 有点道理。 PDF中的图像被表示为无单位样本,在实例化到页面之前本身并没有分辨率。我可以将一个300 dpi、8.5"x11"的1位图像嵌入到PDF中,但是同一图像还可以放入页面的内容流中,并占满整个8.5"x11"的空间,从而保持其分辨率,也可以将其渲染为更小的缩略图(通过缩放创建更高分辨率)——即使这些“分辨率”直到页面实际呈现到设备上也并不适用。此外,PDF渲染器不会阻止进行双线性(或其他)插值,以增加图像的表观分辨率。
为了给您提供更具体的示例,如果我在96 dpi显示器上以100%的比例呈现PDF页面,则该页面的分辨率不超过96 dpi。如果我在1800 dpi的照排机上呈现PDF页面,该页面的分辨率不超过1800 dpi。
如果我在96 dpi显示器上以100%的比例呈现PDF页面上的300 dpi图像,则页面上图像的分辨率为96 dpi。如果我在1800 dpi的照排机上以100%的比例呈现PDF页面上的300 dpi图像,则页面上图像的分辨率为300 dpi。
您从ImageMagick看到的输出可能反映出PDF单位中8.5"x11"页面等于612 x 792,1个PDF单位相当于1/72英寸。预览渲染似乎以约194 dpi进行。

Plinth,非常感谢您对不同渲染方式的详细解释,让我了解到PDF背后的数学渲染。请问根据提供的PDF信息,应该采用什么正确的数学公式来确定JPEG渲染的正确dpi/质量呢?比如这个PDF是8.5"x11",分辨率为300 x/y。 - TeckniX
答案是没有真正的答案。如果页面是单个图像,则必须从该页面中提取图像(或至少其尺寸),然后将(0,0)和(w,h)通过转换矩阵推入从图像空间((0,0)->(1,1))到PDF空间的“最佳”PDF渲染分辨率。换句话说,如果您拥有所有这些信息,那么就很简单了。获取这些信息显然是非常棘手的。 - plinth
这正是我现在遇到的问题——即获取现有PDF中的所有信息,以便获取旋转、尺寸等,并能够创建正确的输出尺寸,使图像以其正确的分辨率和旋转显示。很高兴我不是唯一一个在解决这些问题方面挣扎的人 :) - TeckniX

1

PDF 中的图像被缩小到 PDF 中的某个大小(否则在 Reader 等查看时会被裁剪)。

ImageMagick(我假设 imagick 使用它)使用 GhostScript 将 PDF 转换为图像。GhostScript 在呈现 PDF 文件方面非常出色。我不得不怀疑您是否传递了一些错误的信息。

我们能看到一些代码吗?您的输入 PDF 和输出图像的链接也很好。


我刚刚在你的PDF上运行了gs 8.71,并且它渲染得很好。你使用的GhostScript版本是什么?


看起来 $im->getImageGeometry() 将返回 PDF 中的图像大小 - 由于某种原因,PDF 是横向的,而返回的大小是纵向的? - TeckniX
1
页面被旋转了-90度。这是一种相对罕见的横向方式,但完全合法。其他(更常见)的选项是+90和11x8.5。 - Mark Storer
1
Acrobat Pro成功地保存了页面...所以如果有问题,那就是Adobe软件可以处理的问题(通常情况下...有很多不太有效的PDF文件,但Adobe仍然可以处理)。 - Mark Storer
啊,但这是另一种方式。PDF->图像“相当擅长渲染PDF文件”。 - Mark Storer
你可以通过文本编辑器和对PDF语法的基本理解来找出答案。在文本编辑器中打开PDF文件,然后搜索“/Page”。 - Mark Storer
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接