'Wand' 和 'GDAL' 不适用于处理 PDF
如果您依赖 Wand(ImageMagick 绑定)来处理 PDF,那么您并没有像您想象的那样使用 ImageMagick。
因为 ImageMagick 不能自己处理 PDF——它只能处理光栅图像。
对于其他格式,IM 必须依赖“代表”。 ImageMagick 代表是外部的第三方实用程序,由 ImageMagick 运行,首先将“外国”文件格式转换为光栅图像,然后将其传递给 ImageMagick 以完成进一步的工作。
因此,即使您只想使用 ImageMagick 确定 PDF 页面的尺寸,这也不是一个简单的过程:
调用 Ghostscript 将 PDF 页面呈现为光栅图像。 (你知道 Ghostscript 将使用哪种分辨率来创建栅格吗?!?)
运行一些 ImageMagick 命令以返回 GS 创建的光栅图像的尺寸(以“像素”为单位)。
返回结果可能需要很长时间 - 结果取决于光栅化 PDF 页面时选择的分辨率。
这对工作来说是错误的工具......
(GDAL 基本上与上面相同,即使它不使用 Ghostscript 进行光栅化。但是你知道 GDAL 在将矢量 PDF 页面转换为光栅时使用的默认分辨率吗?!? )
为工作使用正确的工具
PDF 将所有页面的尺寸存储在带有键 /MediaBox 的“字典”中。此密钥必须存在于所有有效的 PDF 文件中。
请注意,PDF 还知道 /CropBox、/ArtBox、/TrimBox 和 /BleedBox 的(可选)概念。 /CropBox 键值(如果存在)可能会命令 PDF 查看器隐藏整个页面的部分内容并仅显示它的较小视口框(在打印或查看时)。
确定 PDF 页面尺寸的一个命令行工具是pdfinfo。此实用程序基于Poppler 库——因此,如果您不想运行外部命令,请将您自己的应用程序绑定到此库。
pdfinfo 更快:
它不需要渲染或光栅化或完全解释 PDF 文件。
它只是对维度的字典条目进行(非常快速的)查找。
这些维度以 points 的形式返回。这个单位起源于 PostScript 世界:72 点相当于 1 英寸。因此,在分辨率为 72 DPI/PPI 时,它也会向您显示“像素尺寸”...
示例(使用来自 OP 的链接 PDF)
我已针对您链接的示例 PDF 运行 pdfinfo 命令以确定页面范围 116-117 的尺寸(使用 -f 表示 first -l 用于该范围的 last 页)。该命令在几分之一秒内完成:
结果如下:
pdfinfo -f 116 -l 117 -box soils-of-manawatu-county-soil-survey-report-30.pdf
Title:
Subject:
Keywords:
Author:
Creator: ABBYY FineReader
Producer:
CreationDate: Tue Dec 18 19:11:50 2007
ModDate: Tue Dec 18 19:11:50 2007
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 117
Encrypted: no
Page 116 size: 957 x 751 pts
Page 116 rot: 0
Page 117 size: 2065 x 2249 pts
Page 117 rot: 0
Page 116 MediaBox: 0.00 0.00 957.00 751.00
Page 116 CropBox: 0.00 0.00 957.00 751.00
Page 116 BleedBox: 0.00 0.00 957.00 751.00
Page 116 TrimBox: 0.00 0.00 957.00 751.00
Page 116 ArtBox: 0.00 0.00 957.00 751.00
Page 117 MediaBox: 0.00 0.00 2065.00 2249.00
Page 117 CropBox: 0.00 0.00 2065.00 2249.00
Page 117 BleedBox: 0.00 0.00 2065.00 2249.00
Page 117 TrimBox: 0.00 0.00 2065.00 2249.00
Page 117 ArtBox: 0.00 0.00 2065.00 2249.00
File size: 2105582 bytes
Optimized: yes
PDF version: 1.2
如您所见,您的 PDF 的 117 页甚至没有相同的页面尺寸!
现在让我们尝试使用 ImageMagick 命令进行同样的操作:([1])
identify \
-format "%W x %H\n" \
soils-of-manawatu-county-soil-survey-report-30.pdf[115-116]
([1] 注意: ImageMagick 的页码方法是从零开始的{first page has number '0'} -- 因此第 116-117 页的 [115-116] 范围。)
这需要 6 秒才能完成,并返回:
957 x 751
2065 x 2249
我在这里很幸运,因为 Ghostscript 似乎已使用等于 -r72x72 的分辨率参数运行。
我已经看到 ImageMagick 设置为使用 -r75x75 的情况——这当然会返回不同的值!
使用另一个 PDF 的示例
接下来的示例使用代表 IXUS 850 IS 相机用户手册的 PDF 完成,可在网上找到。我将只检索前 3 页的信息:
pdfinfo -box -l 3 _IXUS_850IS_ADVCUG_EN.pdf
Creator: FrameMaker 6.0
Producer: Acrobat Distiller 5.0.5 (Windows)
CreationDate: Thu Aug 17 16:43:06 2006
ModDate: Tue Aug 22 12:20:24 2006
Tagged: no
UserProperties: no
Suspects: no
Form: AcroForm
JavaScript: no
Pages: 146
Encrypted: no
Page 1 size: 419.535 x 297.644 pts
Page 1 rot: 90
Page 2 size: 297.646 x 419.524 pts
Page 2 rot: 0
Page 3 size: 297.646 x 419.524 pts
Page 3 rot: 0
Page 1 MediaBox: 0.00 0.00 595.00 842.00
Page 1 CropBox: 87.25 430.36 506.79 728.00
Page 1 BleedBox: 87.25 430.36 506.79 728.00
Page 1 TrimBox: 87.25 430.36 506.79 728.00
Page 1 ArtBox: 87.25 430.36 506.79 728.00
Page 2 MediaBox: 0.00 0.00 595.00 842.00
Page 2 CropBox: 148.17 210.76 445.81 630.28
Page 2 BleedBox: 148.17 210.76 445.81 630.28
Page 2 TrimBox: 148.17 210.76 445.81 630.28
Page 2 ArtBox: 148.17 210.76 445.81 630.28
Page 3 MediaBox: 0.00 0.00 595.00 842.00
Page 3 CropBox: 148.17 210.76 445.81 630.28
Page 3 BleedBox: 148.17 210.76 445.81 630.28
Page 3 TrimBox: 148.17 210.76 445.81 630.28
Page 3 ArtBox: 148.17 210.76 445.81 630.28
File size: 6888764 bytes
Optimized: yes
PDF version: 1.4
从输出中可以看出,所有三个页面大小 ("/MediaBox") 都是 595 x 842 pts (==A4),但不同的 /CropBox 条目将页面的可见部分限制为查看这些页面的端口尺寸:
- 第1页:
419.535 x 297.644 pts
- 第2页:
297.646 x 419.524 pts
- 第3页:
297.646 x 419.524 pts
最重要的是,第一页旋转了 90 度(从Page 1 rot: 90 的行可以看出)。
现在让我们比较一下我的 ImageMagick 命令 ([2]) 返回的内容:
identify -format "%W x %H\n" _IXUS_850IS_ADVCUG_EN.pdf[0-2]
842 x 595
595 x 842
595 x 842
([2] 注意:我系统上的 IM 是 6.9.0-0 Q16 版本,它使用 Ghostscript v9.10 作为委托。如果您在具有其他 IM/GS 版本的不同系统上测试相同的东西,您的输出可能会有所不同!)
所以最后一个例子可以回答 “还有其他因素会影响 PDF 大小(以像素为单位)的计算吗?” OP 问题的一部分。