Php PDF维度与实际内容维度

Php PDF维度与实际内容维度,php,pdf,jpeg,imagick,file-conversion,Php,Pdf,Jpeg,Imagick,File Conversion,我目前正在使用php的imagick将一些PDF转换为图像——这对于输出过程中图像被“切碎”的小细节来说效果很好 这是因为PDF中包含的信息与实际内容维度不同 PDF报告为612x792 72ppi文档,但当我通过mac上的预览从中导出图像时,图像是1651x1275-这怎么可能 很明显,导出是正确的,因为图像在这些维度上被正确地查看-是否PDF只是在宽度和高度混淆的地方被错误地编码了?我如何通过代码检测到这一点?此外,图像导出的大小不同(大得多),大约是两倍大小,这让我相信imagick没有正

我目前正在使用php的imagick将一些PDF转换为图像——这对于输出过程中图像被“切碎”的小细节来说效果很好

这是因为PDF中包含的信息与实际内容维度不同

PDF报告为612x792 72ppi文档,但当我通过mac上的预览从中导出图像时,图像是1651x1275-这怎么可能

很明显,导出是正确的,因为图像在这些维度上被正确地查看-是否PDF只是在宽度和高度混淆的地方被错误地编码了?我如何通过代码检测到这一点?此外,图像导出的大小不同(大得多),大约是两倍大小,这让我相信imagick没有正确读取某些信息

基本上,我想知道是否有一种合适的方法来确定实际的PDF内容大小,以便从中导出的图像尽可能达到最佳质量

谢谢

编辑:(添加代码)


PDF中的图像被缩小到PDF中的某个大小(或者,当您在Reader等人中查看它时,它会被裁剪)

ImageMagick(iASS-u-me imagick使用)使用GhostScript将PDF转换为图像。GhostScript非常擅长渲染PDF文件。我想知道你是不是在传递一些坏消息

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



我刚刚在你的PDF上运行了gs 8.71,效果很好。您使用的是什么版本的GhostScript?

您应该知道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页面上以100%呈现300 dpi图像,则页面上图像的分辨率为96 dpi。如果我在1800 dpi照排机上以100%呈现的PDF页面上以100%呈现300 dpi图像,则页面上图像的分辨率为300 dpi


您从image magick看到的输出可能是反映了以PDF为单位的8.5英寸x 11英寸页面是612 x 792,而1个PDF单位相当于1/72英寸。预览渲染似乎在194 dpi左右完成。

感谢Mark的评论。代码实际上非常简单,没有设置维度,因此使用PDF维度。我将编辑我的原始帖子以添加一些代码。看起来$im->getImageGeometry()将返回PDF中的图像大小-出于某种原因,PDF是横向的,返回的大小是纵向的?页面旋转了-90度。这是一种相对罕见的景观设计方法,但完全合法。其他(更常见的)选项是+90和11x8.5。Acrobat Pro将页面保存得很好。。。因此,如果有问题,adobe软件可以处理(通常情况下…adobe可以处理很多不太有效的PDF)。在看到GhostScript生成的PDF中存在大量错误后,我需要不同意“相当好”的评估。在达到文件大小之前,一切看起来都很好。这真的很粗略。无论何时使用image magick将PDF转换为图像,请确保将
-density
参数设置为正确的DPI,否则质量和大小都会非常糟糕。Mark,图像大小实际上不起作用-在imagick中创建了一组明显的图像,我需要弄清楚,因此,我可以在写出来之前设置每个图像的大小。普林斯感谢您对不同渲染的精彩解释,因为我不知道PDF背后的数学渲染-为了确定基于PDF的jpeg渲染的正确dpi/质量,需要应用什么正确的数学公式提供的信息?这是一个分辨率为300 x/y的8.5英寸x11英寸的相机?答案是没有真正的答案。如果页面是单个图像,则必须从该页面(或至少其维度)提取图像,然后通过从图像空间((0,0)->(1,1))到PDF空间的变换矩阵推送(0,0)和(w,h),以确定“最佳”PDF渲染分辨率。换句话说,如果你掌握了所有这些信息,那就很简单了。获取这些信息绝对不是小事。这正是我现在遇到的问题——从现有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");
?>
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
)