RubyでPDFのページ数を数える

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っぽいなあと思ったので書きなおしてみました。