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にパスワードと権限を設定することができました。

Share post

Related Posts

Comments

comments powered by Disqus