PyMuPDFでPDFにパスワードを設定
2022/03/13 categories:Python| tags:Python|PyMuPDF|PDF|
PyMuPDFでPDFにパスワードを設定してみました。
既存のPDFにパスワードを設定
既存のPDFにパスワードを設定するために、PyMuPDFでテスト用のPDFを作成します。テストPDFの作成に使用したコードは下記の通りです。
import fitz
doc = fitz.open()
doc.new_page(width=297, height=210)
doc.save('output/test_A4.pdf')
doc = fitz.open()
doc.new_page(width=420, height=297)
doc.save('output/test_A3.pdf')
doc = fitz.open()
doc.new_page(width=594, height=420)
doc.save('output/test_A2.pdf')
doc = fitz.open()
doc.new_page(width=841, height=594)
doc.save('output/test_A1.pdf')
doc = fitz.open()
doc.new_page(width=1189, height=841)
doc.save('output/test_A0.pdf')
これで5個のPDFが作成されます。
権限パスワードを設定する例
前述のコードで作成したPDFにパスワードとパスワードなしで許可する権限を設定するコードは下記の通りです。後述のように、パスワード設定してPDFを保存する場合は、上書きするようなパスを指定してはいけないようなので、オリジナルのパスと保存するパスは別のパスになるように指定しています。
import fitz
from pathlib import Path
permissions = fitz.PDF_PERM_ACCESSIBILITY
permissions += fitz.PDF_PERM_ANNOTATE
permissions += fitz.PDF_PERM_ASSEMBLE
permissions += fitz.PDF_PERM_COPY
permissions += fitz.PDF_PERM_FORM
permissions += fitz.PDF_PERM_MODIFY
permissions += fitz.PDF_PERM_PRINT
permissions += fitz.PDF_PERM_PRINT_HQ
owner_pw = '1234567890'
encryption = fitz.PDF_ENCRYPT_AES_256
output = Path('output2')
for p in Path('output').glob('*.pdf'):
doc = fitz.open(p)
doc.save(output/p.name, encryption=encryption, permissions=permissions, owner_pw=owner_pw)
ファイル名(保護)となっていて、プロパティからセキュリティを確認すると権限パスワードが「はい」となっているので、パスワードが設定されていることが確認できました。許可できる権限は上述コードの8個だけのようですが、文書アセンブリとページの抽出が許可できていないので、PyMuPDFの使用ですべての権限を設定できるわけではないで様です。
import fitz
from pathlib import Path
permissions = fitz.PDF_PERM_ACCESSIBILITY
permissions += fitz.PDF_PERM_ANNOTATE
#permissions += fitz.PDF_PERM_ASSEMBLE
#permissions += fitz.PDF_PERM_COPY
permissions += fitz.PDF_PERM_FORM
#permissions += fitz.PDF_PERM_MODIFY
permissions += fitz.PDF_PERM_PRINT
permissions += fitz.PDF_PERM_PRINT_HQ
owner_pw = '1234567890'
encryption = fitz.PDF_ENCRYPT_AES_256
output = Path('output2')
for p in Path('output').glob('*.pdf'):
doc = fitz.open(p)
doc.save(output/p.name, encryption=encryption, permissions=permissions, owner_pw=owner_pw)
上述のコードのようにPDF_PERM_MODIFとPDF_PERM_COPYとPDF_PERM_ASSEMBLEをコメントアウトすると以下の通りになりました。注釈は許可しているので注釈を追加することはできました。
ダメな例1
import fitz
from pathlib import Path
permissions = fitz.PDF_PERM_ACCESSIBILITY
permissions += fitz.PDF_PERM_ANNOTATE
permissions += fitz.PDF_PERM_ASSEMBLE
permissions += fitz.PDF_PERM_COPY
permissions += fitz.PDF_PERM_FORM
permissions += fitz.PDF_PERM_MODIFY
permissions += fitz.PDF_PERM_PRINT
permissions += fitz.PDF_PERM_PRINT_HQ
owner_pw = '1234567890'
encryption = fitz.PDF_ENCRYPT_AES_256
for p in Path('output').glob('*.pdf'):
doc = fitz.open(p)
doc.save(p, encryption=encryption, permissions=permissions)
上記コードを実行すると以下のエラーが出ました。オリジナルのファイルに保存する場合はインクリメンタルでなければならないようです。
例外が発生しました: ValueError
save to original must be incremental
ダメな例2
import fitz
from pathlib import Path
permissions = fitz.PDF_PERM_ACCESSIBILITY
permissions += fitz.PDF_PERM_ANNOTATE
permissions += fitz.PDF_PERM_ASSEMBLE
permissions += fitz.PDF_PERM_COPY
permissions += fitz.PDF_PERM_FORM
permissions += fitz.PDF_PERM_MODIFY
permissions += fitz.PDF_PERM_PRINT
permissions += fitz.PDF_PERM_PRINT_HQ
owner_pw = '1234567890'
encryption = fitz.PDF_ENCRYPT_AES_256
for p in Path('output').glob('*.pdf'):
doc = fitz.open(p)
doc.save(p, encryption=encryption, incremental=True, permissions=permissions)
incremental=Trueを追加して実行すると以下のエラーが出ました。暗号化を変更する場合はインクリメンタルで保存できないようです。ということで、前述したPDFを別名で保存する必要があるようです。
例外が発生しました: RuntimeError
Can't do incremental writes when changing encryption
文書を開くパスワードを設定する例
import fitz
from pathlib import Path
permissions = fitz.PDF_PERM_ACCESSIBILITY
permissions += fitz.PDF_PERM_ANNOTATE
#permissions += fitz.PDF_PERM_ASSEMBLE
#permissions += fitz.PDF_PERM_COPY
permissions += fitz.PDF_PERM_FORM
#permissions += fitz.PDF_PERM_MODIFY
permissions += fitz.PDF_PERM_PRINT
permissions += fitz.PDF_PERM_PRINT_HQ
owner_pw = '1234567890'
encryption = fitz.PDF_ENCRYPT_AES_256
output = Path('output2')
for p in Path('output').glob('*.pdf'):
doc = fitz.open(p)
doc.save(output/p.name, encryption=encryption, permissions=permissions, owner_pw=owner_pw, user_pw=owner_pw)
上述のコードを実行してPDFを開くと以下のようにパスワードを求められました。
パスワードを入力するとPDFを開くことができてセキュリティは以下のようになっていました。
以上のような感じでPyMuPDFを使用してPDFにパスワードと権限を設定することができました。