綾小路龍之介の素人思考

[pdf] オーナーパスワードで利用制限されているファイルをページ抽出分割結合操作

ページ抽出分割結合操作を行うにはpdftkを使う場合が多い。ただし、オーナーパスワードで利用制限をかけられたpdfファイルを古いpdftkで処理しようとするとうまくいかないことがある。その場合は、pdftkを使ったページ操作の前処理としてほかのツールでオーナーパスワードによる利用制限の無効化を行う。これをするにはqpdf --decrypt、gs、pdfcrackなどのツールを使う方法がある。最終的にページ操作を行うならpdftkの新しいバージョンを使う、ページ操作を行わずに利用制限の無効化だけを行う場合はqpdf --decryptを使う。

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

リファレンス

  1. Remove passwords from PDF files | At The Core
  2. Does PDFTK respect PDF security flags? - Super User
  3. PDFの標準セキュリティ機能
  4. QPDF Manual
  5. Linux / FreeBSD: PDFCrack A Command Line Password Recovery Tool For PDF Files - nixCraft
  6. pdftk で切出したらOWNER PASSWORD REQUIRED - それマグで!
  7. HowTo: Linux Remove a PDF File Password Using Command Line Options
  8. linux - Remove the last page of a pdf file using PDFTK? - Stack Overflow
  9. #531529 - pdftk needs owner password to handle DRM'd PDFs - Debian Bug report logs
  10. PDFtk Version History
  11. pdftk and qpdf to reset PDF commenting security - Stack Overflow

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-09-16T15:04:30+09:00
  2. Modified: 2010-09-16T15:04:30+09:00
  3. Generated: 2017-06-22T23:09:19+09:00