2011-05-19 167 views
3

我目前使用php的imagick将一些PDF转换为图像 - 这适用于图像在输出过程中被“切碎”的小细节。PDF尺寸对实际内容尺寸

这是由于包含在PDF VS实际内容维度信息的差异。

的PDF报告是一个612x792 72ppi文件,但是当我通过它预览在Mac上导出图像时,图像是1651x1275 - 这怎么可能?

显然,出口是正确的,因为该图象在这些尺寸正确查看 - 可能不会是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 
) 
+0

似乎一切都很好。这真的很粗略。 – 2011-05-20 17:06:39

+0

无论何时您将PDF转换为带有图像魔术贴的图像,都要确保将“-density”参数设置为正确的DPI,否则质量和尺寸将会非常可怕。 – Orbling 2011-05-20 18:21:47

+0

标记,图像大小实际上不起作用 - 在imagick中有一个明显的图像阵列,我需要弄清楚,这样我才能在每个图像上设置大小,然后再写出它们。 – TeckniX 2011-05-20 20:14:51

回答

1

PDF中的图像在PDF内缩小到一定尺寸(或者在Reader等中查看它时会被裁剪)。

的ImageMagick(这是我的屁股-U-我imagick用途)使用GhostScript的到PDF转换为图像。 GhostScript非常适合渲染PDF文件。我不知道你是否传递了一些不好的信息。

我们可以看到一些代码吗?链接到您的输入PDF和​​输出图像[S]也不错。


我只是GS 8.71跑了您的PDF,它呈现的罚款。你使用的是什么版本的GhostScript?

+0

感谢Mark发表评论。实际上代码非常简单,并且没有设置尺寸,因此正在使用PDF尺寸。我将编辑我的原始帖子以添加一些代码。 – TeckniX 2011-05-20 13:25:52

+0

看起来像$ im-> getImageGeometry()将返回PDF中的图像大小 - 出于某种原因,pdf处于横向并且返回的大小是纵向的? – TeckniX 2011-05-20 16:53:45

+1

页面旋转-90度。这是一种相对罕见的做风景的方式,但是完全合法。其他(更常见)选项是+90和11x8.5。 – 2011-05-20 17:08:49

2

您应该知道,PDF本身就是一个无分辨率的格式。页面以数学方式进行描述,除了浮点数字所规定的限制外,页面不受任何特定分辨率限制的束缚。

PDF唯一真正具有当它呈现给特定设备的分辨率(这可能会或可能不会在设备的分辨率)。

“但是图像怎么样?PDF中的图像肯定会给它分辨率!”有点。 PDF中的图像被表示为无单元样本,并且在它们已经在页面上实例化之前它们本身不具有分辨率。我可以将300 dpi 8.5“x11”1位图像嵌入到PDF中,但是可以将相同的图像放入填满整个8.5“x11”空间的页面的内容流中,从而维护该分辨率或它可以被渲染成一个更小的缩略图(通过规模创建更高的分辨率) - 甚至这些“分辨率”不适用,直到页面实际呈现给设备。另外,不会阻止PDF渲染器执行双线性(或其他)插值来增加图像的表观分辨率。

为了给你一个更具体的例子,如果我在100%呈现96 dpi的显示器上PDF页面,该页面的分辨率不超过96 dpi的。如果我在1800 dpi照排机上渲染该PDF页面,页面的分辨率不会超过1800 dpi。

如果我在呈现100%96 dpi的显示器上呈现的PDF页面上100%300dpi的图像,在页面上的图像的分辨率为96 dpi的。如果我在1800 dpi照排机上以100%渲染的PDF页面上以100%渲染300 dpi图像,则页面上图像的分辨率为300 dpi。

您从图像magick中看到的输出是可能是反映PDF单位中的8.5“x 11”页面是612 x 792和1 PDF单位相当于1/72英寸。预览渲染似乎在〜194 dpi完成。直到你得到的文件大小

+0

plinth谢谢你对不同渲染的精彩解释,因为我不知道PDF背后的数学渲染 - 为了确定基于jpeg渲染的正确dpi /质量,正确的数学公式是什么?关于提供的PDF信息?在这个是一个8.5“x11”与300 x/y分辨率? – TeckniX 2011-05-20 20:13:45

+0

答案是没有真正的答案。 *如果页面是单个图像,则必须从该页面(或至少其尺寸)中提取图像,然后将(0,0)和(w,h)通过从图像空间(( 0,0) - >(1,1))转换为PDF空间以找出“最佳”PDF渲染分辨率。换句话说,如果你有所有这些信息,那就很简单。获取这些信息绝对是不平凡的。 – plinth 2011-05-20 20:38:39

+0

这正是我现在运行的问题 - 从现有的PDF中获取所有信息以获取旋转,尺寸等,并能够创建正确的输出尺寸以使图像显示在其中适当的分辨率和旋转。很高兴我不是唯一一个正在努力解决这些问题的人之一:) – TeckniX 2011-05-20 21:24:29