Rubyスクリプトから,既存のPDFファイルの総ページ数をカウントしたいことがたまにあります。
方法はいくつか考えられます(多少強引なのも含めて)。
PDF::Readerを使う方法
たぶん一番スマート。
#!/usr/bin/env ruby require 'pdf/reader' fname = "test.pdf" p PDF::Reader.new(fname).page_count
PDF::Readerはgemでインストールできます。
$ gem install pdf-reader
pdftkコマンドを呼び出す方法
pdftkコマンドはdump_dataオプションで様々なメタデータを表示してくれます。
$ pdftk test.pdf dump_data
InfoKey: Producer
InfoValue: iTextSharp 5.0.2 (c) 1T3XT BVBA
InfoKey: ModDate
InfoValue: D:20131028210513+09'00'
InfoKey: CreationDate
InfoValue: D:20131028210513+09'00'
PdfID0: 418375f18c4b17f2fd9ca9967ae6eec
PdfID1: 9f23ad88a1b23ebbcd95106b2b38309c
NumberOfPages: 10
この中に NumberOfPages: 10 というのがあるので,これを得るという方法です。
出力はちょうどYAMLフォーマットみたいになっている(同じキーが重複しているので厳密には違うかも知れませんが……)ので,yamlライブラリを使ってしまいましょう。
#!/usr/bin/env ruby require 'yaml' fname = "test.pdf" p YAML.load(`pdftk #{fname} dump_data`).fetch("NumberOfPages").to_i
pdftkコマンドは,Ubuntu 等でしたらaptでインストールできます。
$ apt-get install pdftk
pdfinfoコマンドを呼び出す方法
pdfinfoコマンドも様々なメタデータを表示してくれます。
$ pdfinfo test.pdf
Producer: iTextSharp 5.0.2 (c) 1T3XT BVBA
CreationDate: Mon Oct 28 21:05:13 2013
ModDate: Mon Oct 28 21:05:13 2013
Tagged: no
Pages: 10
Encrypted: no
Page size: 595 x 842 pts (A4)
File size: 23148789 bytes
Optimized: no
PDF version: 1.4
この中に Pages: 10 というのがあるので,これを得るという方法です。
こちらも出力がYAMLっぽいのでまたyamlを使っちゃいましょう。
#!/usr/bin/env ruby require 'yaml' fname = "test.pdf" p YAML.load(`pdfinfo #{fname}`).fetch("Pages").to_i
なお,1ページしかないPDFの場合も,「Pages:」が「Page:」になるなんてことは無いみたいなので,そこは安心して良いみたいです(笑)。
pdfinfoコマンドはPopplerの一部のようなので,Ubuntu 等でしたらaptでインストールできます。
$ apt-get install poppler-utils
2013/12/12追記: pdftkとpdfinfoの出力フォーマットって良く考えたらYAMLっぽいなあと思ったので書きなおしてみました。