9

我需要扫描上传的 PDF 以确定其中的页面是否都是纵向的,或者是否有横向页面。有没有办法可以使用 PHP 或 linux 命令来扫描这些页面的 PDF?

4

2 回答 2

16

(更新的答案 - 向下滚动......)

您可以使用pdfinfopoppler-utilsxpdf-tools的一部分)或identify(ImageMagick 工具包的一部分)。

确认:

identify -format "%f  Page %s:   Width: %W -- Height: %H\n" T-VD7.PDF

示例输出:

T-VD7.PDF  Page 0:  Width: 595 -- Height: 842
T-VD7.PDF  Page 1:  Width: 595 -- Height: 842
T-VD7.PDF  Page 2:  Width: 1191 -- Height: 842
[...]
T-VD7.PDF  Page 11:  Width: 595 -- Height: 421
T-VD7.PDF  Page 12:  Width: 595 -- Height: 842

或者更简单一点:

identify -format "%s: %Wx%H\n" T-VD7.PDF

给出:

0:  595x842
1:  595x842
2:  1191x842
[...]
11:  595x421
12:  595x842

注意,如何identify使用从零开始的页面计数机制!

如果页面的宽度大于高度,则页面为“横向”。如果两者相等,则它们既不是也不是。

优点是可以identify让您非常轻松且非常广泛地调整输出格式。

pdf信息:

pdfinfo input.pdf | grep "Page.*size:"

示例输出:

Page size:      595.276 x 841.89 pts (A4)

pdfinfo如果涉及多页 PDF,肯定比更快、更精确。identify我测试的 13 页 PDF 需要identify31 秒才能处理,而pdfinfo需要不到半秒......

警告:默认情况下只pdfinfo报告第一页的大小。要获取所有页面的大小(您可能知道,有些 PDF 使用混合页面大小和混合方向),您必须修改命令:

pdfinfo -f 3 -l 13 input.pdf | grep "Page.*size:"

现在输出:

Page    1 size: 595.276 x 841.89 pts (A4)
Page    2 size: 595.276 x 841.89 pts (A4)
Page    3 size: 1191 x 842 pts (A3)
[....]
Page   12 size: 595 x 421 pts (A5)
Page   13 size: 595.276 x 841.89 pts (A4)

这将打印第 3 页(首先报告)到第 13 页(最后报告)的大小。

编写脚本:

  pdfinfo \
    -f 1 \
    -l 1000 \
     Vergleich-VD7.PDF \
| grep "Page.* size:" \
| \
| while read Page _pageno size _width x _height rest; do 
  [ "$(echo "${_width} / 1"|bc)" -gt "$(echo "${_height} / 1"|bc)" ] \
     && echo "Page $_pageno is landscape..." \
    || echo "Page $_pageno is portrait..."  ; \
 done

bc-trick 是必需的,因为-gt比较仅适用于整数的 shell。除以1withbc会将可能的实数值取整为整数......)

结果:

Page 1 is portrait...
Page 2 is portrait...
Page 3 is landscape...
[...]
Page 12 is landscape...
Page 13 is portrait...

更新:使用“权利”pdfinfo发现页面旋转...

我最初的回答吹响了pdfinfo. Serenade X 在评论中说他/她的问题是发现旋转的页面。

好的,这里有一些尚未广为人知的附加信息,因此尚未被所有pdfinfo用户真正吸收......

正如我所提到的,有两种不同的pdfinfo实用程序:

  1. 作为xpdf-utils包的一部分提供的一个(在某些平台上也称为xpdf-tools)。
  2. 作为包的一部分出现的那个poppler-utils(在某些平台上也称为poppler-tools,有时它不是作为包分开而是作为主poppler包的一部分)。

波普勒的pdfinfo输出

因此,这里是 Popplerpdfinfo命令的示例输出。测试文件是 2 页 PDF,其中第一页为纵向 A4,第二页为横向 A4 格式:

kp@mbp:~$ pdfinfo -f 1 -l 2 a4portrait+landscape.pdf
制作人:GPL Ghostscript 9.05
创建日期:2012 年 7 月 26 日星期四 14:23:31
修改日期:2012 年 7 月 26 日星期四 14:23:31
标签: 没有
形式:无
页数:2
加密:否
第 1 页尺寸:595 x 842 磅 (A4)
第 1 页腐烂:0
第 2 页尺寸:842 x 595 磅 (A4)
第 2 页腐烂:0
文件大小:3100 字节
优化:无
PDF版本:1.4

你看到说Page 1 rot: 0和的线条了Page 2 rot: 0吗?

你注意到这句话Page 1 size: 595 x 842 pts (A4)Page 2 size: 842 x 595 pts (A4)两者之间的区别了吗?

XPDF 的pdfinfo输出

现在让我们将其与 XPDF 的输出进行比较pdfinfo

kp@mbp:~$ xpdf-pdfinfo -f 1 -l 2 a4portrait+landscape.pdf
制作人:GPL Ghostscript 9.05
创建日期:2012 年 7 月 26 日星期四 14:23:31
修改日期:2012 年 7 月 26 日星期四 14:23:31
标签: 没有
页数:2
加密:否
第 1 页尺寸:595 x 842 磅 (A4)
第 2 页尺寸:842 x 595 磅 (A4)
文件大小:3100 字节
优化:无
PDF版本:1.4

如果您仔细观察,您可能会注意到另一个不同之处。我不会把手指指向它,我会暂时闭上嘴...... :-)

Popplerpdfinfo正确报告第 2 页的旋转

pdftk接下来,我使用(我没有 Adob​​e Acrobat)将文件的第二页旋转 90 度:

pdftk \
  a4portrait+landscape.pdf \
  cat 1 2E \
  output a4portrait+landscape---page2-landscaped-by-pdftk.pdf 

现在波普勒的pdfinfo报道是这样的:

kp@mbp:~$ pdfinfo -f 1 -l 2 a4portrait+landscape---page2-landscaped-by-pdftk.pdf
创建者:pdftk 1.44 - www.pdftk.com
制作人:itext-paulo-155 (itextpdf.sf.net-lowagie.com)
创建日期:2012 年 7 月 26 日星期四 14:39:47
修改日期:2012 年 7 月 26 日星期四 14:39:47
标签: 没有
形式:无
页数:2
加密:否
第 1 页尺寸:595 x 842 磅 (A4)
第 1 页腐烂:0
第 2 页尺寸:842 x 595 磅 (A4)
第 2 页腐烂:90
文件大小:1759 字节
优化:无
PDF版本:1.4

如您所见,该行Page 2 rot: 90告诉我们我们正在寻找什么。XPDFpdfinfo将基本上报告有关更改文件的信息,就像它报告原始文件一样。当然,它仍然可以正确捕获更改的Creator:,Producer:*Date:信息,但它会错过旋转的页面......

还要注意这个细节:第2页最初设计为横向页面,从Page 2 size: 842 x 595 pts (A4)信息部分可以看出。但是,它在当前 PDF 中显示为纵向页面,如Page 2 rot: 90部件所示。

另请注意,轮换信息可能会出现 4 个不同的值:

  • 0(无旋转),
  • 90(向东旋转,或顺时针旋转 90 度),
  • 180(向南旋转,翻滚的页面图像,倒置,或顺时针 180 度),
  • 270(向西旋转,或逆时针旋转 90 度,或顺时针旋转 270 度)。

一些背景信息

Popper(由The Poppler Developers 开发)是XPDF(由Glyph & Cog LLC开发)的一个分支,它发生在 2005 年左右。(当时他们分叉 Poppler 开发人员的重要原因之一是:Glyph & Cog 没有t 总是为与安全相关的问题提供及时的错误修复......)

无论如何,Poppler fork 很长一段时间以来一直保持相关的命令行实用程序、它们的命令行参数和语法以及它们的输出格式与原始 (XPDF/Glyph & Cog LLC) 兼容。

与竞争 XPDF 工具相比,现有的 Poppler 工具获得了额外的功能

但是,最近他们开始添加其他功能。从我的头顶冒出:

  • pdfinfo现在还报告每个页面的轮换状态(从 2012 年 3 月 1 日发布的 Poppler v0.19.0 开始)。
  • pdffonts现在还报告每种字体的字体编码(从 2012 年 3 月 15 日发布的 Poppler v0.19.1 开始)。

Poppler 工具获得更多兄弟姐妹

Poppler 工具还提供了一些额外的命令行实用程序,这些实用程序不在原始 XPDF 包中(其中一些是最近才添加的):

  • pdftocairo- 用于创建 PNG、JPEG、PostScript、EPS、PDF、SVG 的实用程序(使用 Cairo)
  • pdfseparate- 提取 PDF 页面的实用程序
  • pdfunite- 用于合并 PDF 文件的实用程序
  • pdfdetach- 从 PDF 中列出或提取嵌入文件的实用程序
  • pdftohtml- 从 PDF 文件转换 HTML 的实用程序
于 2012-07-17T20:51:12.447 回答
3

identifyImageMagick 附带的将为您提供给定 PDF 文件的宽度和高度(它还需要在系统上安装 GhostScript)。

$ identify -format "%g\n" FILENAME.PDF
1417x1106+0+0

1417宽度在哪里,1106高度在哪里,您(为此)可以忽略+0+0.

编辑:对不起,我指的是Mike B对原始问题的评论 - 正如他所说,在知道宽度和高度后,您可以确定您是否有纵向或横向图像(如果高度 > 宽度则纵向,否则为横向)。

此外,\n添加到参数中的-format参数(如 Kurt Pfeifle 所建议的)会将每个页面分隔成自己的行。他还提到了%W%H格式参数;所有可能的格式参数都可以在这里找到(有很多)。

于 2012-07-17T19:48:05.210 回答