如何使用PHP或Linux脚本查找PDF的方向?

Ser*_*e X 9 php linux pdf

我需要扫描上传的PDF以确定其中的页面是否全部是纵向还是有任何横向页面.有没有我可以使用PHP或Linux命令扫描这些页面的PDF?

Kur*_*fle 15

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

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

识别:

identify -format "%f  Page %s:   Width: %W -- Height: %H\n" T-VD7.PDF
Run Code Online (Sandbox Code Playgroud)

示例输出:

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
Run Code Online (Sandbox Code Playgroud)

或者更简单一点:

identify -format "%s: %Wx%H\n" T-VD7.PDF
Run Code Online (Sandbox Code Playgroud)

得到:

0:  595x842
1:  595x842
2:  1191x842
[...]
11:  595x421
12:  595x842
Run Code Online (Sandbox Code Playgroud)

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

如果页面的宽度大于其高度,则页面为"横向".如果两者相等,它们既不是 - 也不是.

优点是identify可以非常轻松地调整输出格式.

pdfinfo:

pdfinfo input.pdf | grep "Page.*size:"
Run Code Online (Sandbox Code Playgroud)

示例输出:

Page size:      595.276 x 841.89 pts (A4)
Run Code Online (Sandbox Code Playgroud)

pdfinfo肯定是更快,也更精确的identify,如果涉及到多页的PDF文件.(我测试过这本13页的PDF文件需要identify31秒才能处理,而pdfinfo需要不到半秒......)

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

pdfinfo -f 3 -l 13 input.pdf | grep "Page.*size:"
Run Code Online (Sandbox Code Playgroud)

现在输出:

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)
Run Code Online (Sandbox Code Playgroud)

这将打印第3页(的大小˚F通过页面IRST报道)13( AST报告).

编写脚本:

  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
Run Code Online (Sandbox Code Playgroud)

(bc-trick是必需的,因为-gt比较仅适用于整数的shell.除以1with bc将把可能的实数值四舍五入到整数......)

结果:

Page 1 is portrait...
Page 2 is portrait...
Page 3 is landscape...
[...]
Page 12 is landscape...
Page 13 is portrait...
Run Code Online (Sandbox Code Playgroud)

更新:使用"正确" pdfinfo发现页面轮换...

我最初的答案是为了呐喊pdfinfo.Serenade X在评论中表示他/她的问题是发现旋转的页面.

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

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

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

Poppler的pdfinfo输出

所以这是Poppler pdfinfo命令的示例输出.测试文件为2页PDF,第一页为纵向A4,第二页为横向A4格式:

kp@mbp:~$  pdfinfo -f 1 -l 2 a4portrait+landscape.pdf 
Producer:       GPL Ghostscript 9.05
CreationDate:   Thu Jul 26 14:23:31 2012
ModDate:        Thu Jul 26 14:23:31 2012
Tagged:         no
Form:           none
Pages:          2
Encrypted:      no
Page    1 size: 595 x 842 pts (A4)
Page    1 rot:  0
Page    2 size: 842 x 595 pts (A4)
Page    2 rot:  0
File size:      3100 bytes
Optimized:      no
PDF version:    1.4

你看行说Page 1 rot: 0Page 1 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 
Producer:       GPL Ghostscript 9.05
CreationDate:   Thu Jul 26 14:23:31 2012
ModDate:        Thu Jul 26 14:23:31 2012
Tagged:         no
Pages:          2
Encrypted:      no
Page    1 size: 595 x 842 pts (A4)
Page    2 size: 842 x 595 pts (A4)
File size:      3100 bytes
Optimized:      no
PDF version:    1.4

如果你仔细观察,你可能会注意到另外一个区别.我不会指着它,现在我会闭嘴...... :-)

Poppler pdfinfo正确报告第2页的轮换

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

pdftk \
  a4portrait+landscape.pdf \
  cat 1 2E \
  output a4portrait+landscape---page2-landscaped-by-pdftk.pdf 
Run Code Online (Sandbox Code Playgroud)

现在Poppler pdfinfo报告了这个:

kp@mbp:~$  pdfinfo -f 1 -l 2 a4portrait+landscape---page2-landscaped-by-pdftk.pdf 
Creator:        pdftk 1.44 - www.pdftk.com
Producer:       itext-paulo-155 (itextpdf.sf.net-lowagie.com)
CreationDate:   Thu Jul 26 14:39:47 2012
ModDate:        Thu Jul 26 14:39:47 2012
Tagged:         no
Form:           none
Pages:          2
Encrypted:      no
Page    1 size: 595 x 842 pts (A4)
Page    1 rot:  0
Page    2 size: 842 x 595 pts (A4)
Page    2 rot:  90
File size:      1759 bytes
Optimized:      no
PDF version:    1.4

如您所见,该线Page 2 rot: 90告诉我们我们在寻找什么.XPDF pdfinfo本质上会报告与更改文件相同的信息,就像它对原始文件一样.当然,它仍然会正确地捕获更改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(由Poppler开发人员开发)是XPDF(由Glyph&Cog LLC 开发)的一个分支,发生在2005年左右.(当时他们分析Poppler开发人员的一个重要原因是:Glyph&Cog没有' t始终为安全相关问题及时提供错误修正...)

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

现有的Poppler工具比竞争的XPDF工具获得了更多功能

但是,最近他们开始添加其他功能.脱离我的头脑:

  • 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的实用程序