如何通过 Imagick 获取 PDF 页面的宽度和高度?

How to get width and height PDF page by Imagick?

我使用基于 Imagick 库的 Yii2 包 pdf-to-image 将每页 PDF 转换为图像。我还需要获取特定 PDF 页面的宽度和高度或格式。有什么办法吗?

Imagick 是原生 php 扩展,可使用 ImageMagick API 创建和修改图像。所以不要重试任何 PDF 的信息,而是重试图像的信息:

Imagick::getNumberImages — Returns the number of images in the object.

$pdf->getNumberOfPages(); //returns number of images that are equal to number of PDF's pages. This is a method from pdf-to-image package.

PDF 描述一页或多页的内容和外观。它还包含这些页面的物理大小的定义。页面大小定义并不像您想象的那么简单。事实上,一个 PDF 中最多可以有 5 个与其页面大小相关的不同定义。这些称为边界框或页面框。

MediaBox用于指定页面的宽度和高度。对于普通用户,这可能等于实际页面大小。

PDF 中的每个页面对于不同的页面框可以有不同的大小。

PDF 总是有一个 MediaBox 定义。所有其他页面框不一定必须存在于常规 PDF 文件中。

MediaBox 是 PDF 中最大的页面框。其他页面框可以等于 MediaBox 的大小,但预计它们不会更大(后者在 PDF/X-4 要求中明确要求)。如果它们更大,PDF 查看器将使用 MediaBox 的值。

您应该能够检索到准确的 "HiResBoundingBox" 值(即 PDF 中的 MediaBox 值)。

测试文档为 A4 (210mm x 297mm),大小为 595.28pt x 841.89pt,有四 (4) 页。

这些值的单位是 PostScript 点(其中 72 磅 == 1 英寸)。

$pdf = "1.pdf";
$output = shell_exec("identify -format \"%[pdf:HiResBoundingBox]\" $pdf");
echo $output;

打印这个字符串:

595.28x841.89+0+0595.28x841.89 +0+0595.28x841.89+0+0595.28x841.89+0+0

使用一些 REGEX 你可以获得宽度:595.28pt 和高度:841.89pt对于每一页并将它们转换为毫米。

这个方法怎么样? 通过 Imagick 我可以轻松地从 pdf 文件中获取图像 $RESOLUTION = 300; $myurl = 'filename.pdf['.$pagenumber.'];' $image = new Imagick($myurl); $image->setResolution( $RESOLUTION , $RESOLUTION ); $image->setImageFormat( "png" ); $image->writeImage('newfilename.png');

现在我有来自 PDF 文件页面的图像。我知道分辨率(每英寸像素数),我可以得到图像的宽度和高度(以像素为单位)。因此,无需具备深厚的数学知识即可以英寸为单位计算 PDF 页面的宽度和高度: $pdfPageWidth = $imageWidth / $RESOLUTION; $pdfPageHeight = $imageHeght/ $RESOLUTION;