9

アップロードされたPDFをスキャンして、中のページがすべて縦向きであるか、横向きであるかを判断する必要があります。どういうわけか、PHPまたはLinuxコマンドを使用してPDFをスキャンしてこれらのページを探すことができますか?

4

2 に答える 2

16

(更新された回答-下にスクロール...)

pdfinfopoppler-utilsまたはxpdf-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、出力フォーマットを非常に簡単かつ広範囲に微調整できることです。

pdfinfo:

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

出力例:

Page size:      595.276 x 841.89 pts (A4)

pdfinfo複数ページのPDFに関しては、よりも確実に高速で正確です。identify私がこれをテストした13ページのPDFはidentify、処理に31秒かかりましたが、pdfinfo必要な時間は0.5秒未満でした。...

警告:デフォルトでは、最初のページ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が必要です。withで除算すると、可能な実数値が整数に丸められます...)-gt1bc

結果:

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

更新:「右」を使用してpdfinfoページの回転を検出します。

私の最初の答えは、の角をもてあそんだpdfinfo。セレナーデXはコメントの中で、彼/彼女の問題は回転したページを発見することであると述べています。

さて、ここにまだ広く知られていないいくつかの追加情報があります。そのため、まだすべてのpdfinfoユーザーに実際に吸収されていません...

私が述べたように、周りには2つの異なるpdfinfoユーティリティがあります。

  1. パッケージの一部としてxpdf-utils提供されるもの(一部のプラットフォームではxpdf-tools)。
  2. パッケージの一部としてpoppler-utils提供されるもの(一部のプラットフォームpoppler-toolsでは、とも呼ばれ、パッケージとして分離されていない場合もありますが、メインpopplerパッケージの一部です)。

Popplerのpdfinfo出力

これがPopplerのpdfinfoコマンドからの出力例です。テストされたファイルは2ページのPDFで、最初のページは縦向きのA4で、2番目のページは横向きのA4形式です。

kp @ mbp:〜$ pdfinfo -f 1 -l 2 a4portrait + landscape.pdf
プロデューサー:GPL Ghostscript 9.05
作成日:2012年7月26日木曜日14:23:31
ModDate: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)2つの違いに気づきましたか?

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
ModDate:2012年7月26日木曜日14:23:31
タグ付き:いいえ
ページ:2
暗号化:いいえ
ページ1サイズ:595 x 842ポイント(A4)
ページ2サイズ:842 x 595ポイント(A4)
ファイルサイズ:3100バイト
最適化:いいえ
PDF版:1.4

よく見ると、もう1つの違いに気付くかもしれません。私はそれに指を向けないでしょう、そして今のところ私の口を閉じたままにします... :-)

Popplerpdfinfoは2ページのローテーションを正しく報告します

次に、ファイルの2ページ目を90度回転しますpdftk(Adobe Acrobatはありません)。

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

今、Popplerpdfinfoはこれを報告しています:

kp @ mbp:〜$ pdfinfo -f 1 -l 2 a4portrait + landscape --- page2-landscaped-by-pdftk.pdf
作成者:pdftk 1.44-www.pdftk.com
プロデューサー:itex-paulo-155(itextpdf.sf.net-lowagie.com)
作成日:2012年7月26日木曜日14:39:47
ModDate: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度)。

いくつかの背景情報

PopperThe Poppler Developersによって開発された)は、 2005年頃に発生したXPDFGlyph&Cog LLCによって開発された)のフォークです。 tセキュリティ関連の問題に対して常にタイムリーなバグ修正を提供します...)

とにかく、Popplerフォークは非常に長い間、関連するコマンドラインユーティリティ、それらのコマンドラインパラメータと構文、および元の(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

編集:申し訳ありませんが、元の質問に対するマイクBのコメントを参照していました。彼が言ったように、幅と高さを知った後、ポートレートまたは横向きの画像があるかどうかを判断できます(高さ>幅の場合はポートレート、それ以外の場合は横向き)。

また、引数に\n追加されると-format(Kurt Pfeifleによって提案されたように)、各ページが独自の行に分割されます。%W彼はまた、および%Hフォーマットパラメータについても言及しています。可能なすべてのフォーマットパラメータはここにあります(それらはたくさんあります)。

于 2012-07-17T19:48:05.210 に答える