pdfinfoで処理するpdfの情報を見る
pdfの情報を確認するにはpdfinfoやqpdf --show-encryptionを使う。オーナーパスワードによる利用制限がかかっていることがわかる。以下のようなpdfファイルから一部のページを抽出して新しいファイルを作ることを考える。
$ pdfinfo ********************.pdf Title: ************ Keywords: **************************************** Author: **************************** Creator: QuarkXPress(R) 9.53r1 Producer: QuarkXPress(R) 9.53r1 CreationDate: Sun Dec 8 20:30:16 2013 ModDate: Sat Jan 18 19:06:00 2014 Tagged: yes Pages: 2 Encrypted: yes (print:yes copy:no change:no addNotes:no) Page size: 595.276 x 779.528 pts File size: 1001292 bytes Optimized: yes PDF version: 1.7 $ qpdf --show-encryption ********************.pdf R = 4 P = -1340 User password = extract for accessibility: allowed extract for any purpose: not allowed print low resolution: allowed print high resolution: allowed modify document assembly: not allowed modify forms: not allowed modify annotations: not allowed modify other: not allowed modify anything: not allowed
pdftk 2.01 で直接処理する場合
pdftk 2.01ではこのファイルを問題なく取り扱える。下は1ページ目から最後から2ページ目までを抽出する例。ただし、オーナーパスワードを与えなかったので、著作権を尊重してとメッセージが出る。実際作られたファイルはオーナーパスワードを設定することで可能になる暗号化が無くなり利用制限がすべて許可状態になっていることがわかる。
$ pdftk ********************.pdf cat 1-r2 output out.pdf WARNING: The creator of the input PDF: ********************.pdf has set an owner password (which is not required to handle this PDF). You did not supply this password. Please respect any copyright. $ pdfinfo out.pdf Creator: pdftk 2.01 - www.pdftk.com Producer: itext-paulo-155 (itextpdf.sf.net-lowagie.com) CreationDate: Fri Mar 14 12:26:48 2014 ModDate: Fri Mar 14 12:26:48 2014 Tagged: no Pages: 1 Encrypted: no Page size: 595.276 x 779.528 pts File size: 611935 bytes Optimized: no PDF version: 1.7
qpdf --decryptで利用制限の無効化、pdftk 1.44でページ操作を行う場合
pdftk 1.44 ではこのファイルを取り扱うことができない。エラーが起きて失敗していることがわかる。このため、ページ抽出の前処理にqpdf --decryptを使って暗号化をはずす。こうすることで暗号化と利用制限がはずされたことがわかる。
$ pdftk ********************.pdf cat output out.pdf Error: Failed to open PDF file: ********************.pdf Errors encountered. No output created. Done. Input errors, so no output created. $ qpdf --decrypt ********************.pdf decrypted.pdf $ pdfinfo decrypted.pdf Title: ************ Keywords: **************************************** Author: **************************** Creator: QuarkXPress(R) 9.53r1 Producer: QuarkXPress(R) 9.53r1 CreationDate: Sun Dec 8 20:30:16 2013 ModDate: Sat Jan 18 19:06:00 2014 Tagged: yes Pages: 2 Encrypted: no Page size: 595.276 x 779.528 pts File size: 993268 bytes Optimized: no PDF version: 1.7
本当の目的であるページ抽出を行う。下は1ページ目から最後から2ページ目までを抽出する例 (pdftk 1.44ではページ範囲指定に後ろから2ページ目r2という指定が使えない、この機能が使えるのは1.45以降。このため pdfinfo でページ数を取得してそこから1引いたものを範囲指定引数に与えている)。
$ pdftk decrypted.pdf cat 1-$(($(pdfinfo decrypted.pdf | grep Pages | awk '{print $2}') - 1)) output out.pdf $ pdfinfo out.pdf Creator: pdftk 1.44 - www.pdftk.com Producer: itext-paulo-155 (itextpdf.sf.net-lowagie.com) CreationDate: Fri Mar 14 21:57:06 2014 ModDate: Fri Mar 14 21:57:06 2014 Tagged: no Pages: 1 Encrypted: no Page size: 595.276 x 779.528 pts File size: 603799 bytes Optimized: no PDF version: 1.4
ghostscript で利用制限の無効化、pdftk 1.44でページ操作を行う場合
エラーは出ないが、背景画像が消えるなどの問題あり。
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=decrypted.pdf ********************.pdf warning: ignoring invalid option raw $ pdftk decrypted.pdf cat 1-$(($(pdfinfo decrypted.pdf | grep Pages | awk '{print $2}') - 1)) output out.pdf $ pdfinfo out.pdf Creator: pdftk 1.44 - www.pdftk.com Producer: itext-paulo-155 (itextpdf.sf.net-lowagie.com) CreationDate: Fri Mar 14 22:25:48 2014 ModDate: Fri Mar 14 22:25:48 2014 Tagged: no Pages: 1 Encrypted: no Page size: 595.276 x 779.528 pts File size: 148011 bytes Optimized: no PDF version: 1.4
pdfcrack でオーナーパスワードを探索、pdftk 1.44でページ操作を行う場合
さらに別の考え方として、pdfcrack でオーナーパスワードをクラックする方法がある。これにはそれなりに時間がかかる。元文書のオーナーパスワードが不要の場合はqpdf --decryptを使ってしまうほうが早い。ページ操作をするpdftkにオーナーパスワードを与えるには input_pw オプションを使う。
$ pdfcrack -f ********************.pdf -o PDF version 1.7 Security Handler: Standard V: 4 R: 4 P: -1340 Length: 128 Encrypted Metadata: False FileID: ******************************** U: **************************************************************** O: **************************************************************** Average Speed: 12101.3 w/s. Current Word: 'N69' Average Speed: 12318.1 w/s. Current Word: 'nccb' Average Speed: 12341.6 w/s. Current Word: 'ypec' Average Speed: 12255.4 w/s. Current Word: 'Tagd' ... found owner-password: 'aaaa' found user-password: '' $ pdftk ********************.pdf input_pw '0000' cat 1-$(($(pdfinfo ********************.pdf | grep Pages | awk '{print $2}') - 1)) output out.pdf $ pdfinfo out.pdf Creator: pdftk 1.44 - www.pdftk.com Producer: itext-paulo-155 (itextpdf.sf.net-lowagie.com) CreationDate: Fri Mar 14 23:03:02 2014 ModDate: Fri Mar 14 23:03:02 2014 Tagged: no Pages: 1 Encrypted: no Page size: 595.276 x 779.528 pts File size: 603860 bytes Optimized: no PDF version: 1.4
find+xargsで自動化する
見つかったすべてのファイルに対して同じページ操作を行う場合は、新しいpdftkでページ操作して、最後に連結。
$ find -type f -name 'hoge*.pdf' -print0 | xargs -0 -r -n 1 -I{} pdftk {} cat 1-r2 output {}.dec.pdf $ pdftk *.pdf.dec.pdf cat output all.pdf $ rm *.pdf.dec.pdf
$ for i in $(seq 1996 2012); do cd hoge${i}/ && find -type f -name '*.pdf' -print0 | xargs -0 -r -n 1 -I {} pdftk {} cat 1-r2 output {}.dec.pdf && pdftk *.pdf.dec.pdf cat output ../hoge${i}.pdf && rm *.pdf.dec.pdf && cd ../ ; done
見つかったすべてのファイルに対してページ操作を行わない場合はqpdfで制限を解除して、最後に連結。
$ find -type f -name 'hoge*.pdf' -print0 | xargs -0 -r -n 1 -I{} qpdf --decrypt {} {}.dec.pdf $ pdftk *.pdf.dec.pdf cat output all.pdf