4

こんにちは、パスワードで保護された印刷、コピー、貼り付けオプションを既存の PDF に設定できるようにする Python ライブラリを探しています。

私は reportlab pdfencrypt モジュールを見ました: これはまさに私が必要とするオプションを持っていますが、オープン ソース バージョンは厳しく制限されています - 実際のパスワードを設定することさえできず、ライセンスはオプションではありません (£1000/年以上) - これは比較的少量 (1 年間に処理されるドキュメント数が 1,000 未満)、クライアントが非営利団体である

どんな提案でも大歓迎です!

4

4 に答える 4

3

あなたは(私のように)考えたに違いありません-WTFは"-3904"ケビンの答えからです。

安心してください - 私には答えがあります)。

PDF 1.6リファレンスで見つけました。ここから入手できます: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdf_reference_archive/PDFReference16.pdf

3.5 セクション、ページ番号 99:

ドキュメントがユーザー アクセスで開かれたときに付与されるアクセス許可を指定する一連のフラグを含む 32 ビット整数。これらのフラグの意味を表 3.20 に示します。フラグ ワード内のビット位置には、1 (下位) から 32 (上位) までの番号が付けられます。任意の位置の 1 ビットは、対応するアクセス許可を有効にします。どのビットが意味を持ち、場合によってはどのように解釈されるかは、セキュリティ ハンドラのリビジョン番号 (暗号化辞書の R エントリで指定) によって異なります。

*注意: PDF 整数オブジェクトは、符号付き 2 の補数形式で内部的に表されます。暗号化辞書の P 値の予約上位フラグビットはすべて 1 である必要があるため、値は負の整数で指定する必要があります。たとえば、セキュリティ ハンドラのリビジョン 2 を想定すると、値 -44 は印刷とコピーを許可しますが、内容と注釈の変更は許可しません。

だから、P許可です!その資料の表を確認してください。ビット表現です-4411010100

このように作成しました(印刷とコピーは許可されていますが、内容の変更と注釈は許可されていません):

from hashlib import md5

from PyPDF4 import PdfFileReader, PdfFileWriter
from PyPDF4.generic import NameObject, DictionaryObject, ArrayObject, \
    NumberObject, ByteStringObject
from PyPDF4.pdf import _alg33, _alg34, _alg35
from PyPDF4.utils import b_


def encrypt(writer_obj: PdfFileWriter, user_pwd, owner_pwd=None, use_128bit=True):
    """
    Encrypt this PDF file with the PDF Standard encryption handler.

    :param str user_pwd: The "user password", which allows for opening
        and reading the PDF file with the restrictions provided.
    :param str owner_pwd: The "owner password", which allows for
        opening the PDF files without any restrictions.  By default,
        the owner password is the same as the user password.
    :param bool use_128bit: flag as to whether to use 128bit
        encryption.  When false, 40bit encryption will be used.  By default,
        this flag is on.
    """
    import time, random
    if owner_pwd == None:
        owner_pwd = user_pwd
    if use_128bit:
        V = 2
        rev = 3
        keylen = int(128 / 8)
    else:
        V = 1
        rev = 2
        keylen = int(40 / 8)
    # permit copy and printing only:
    P = -44
    O = ByteStringObject(_alg33(owner_pwd, user_pwd, rev, keylen))
    ID_1 = ByteStringObject(md5(b_(repr(time.time()))).digest())
    ID_2 = ByteStringObject(md5(b_(repr(random.random()))).digest())
    writer_obj._ID = ArrayObject((ID_1, ID_2))
    if rev == 2:
        U, key = _alg34(user_pwd, O, P, ID_1)
    else:
        assert rev == 3
        U, key = _alg35(user_pwd, rev, keylen, O, P, ID_1, False)
    encrypt = DictionaryObject()
    encrypt[NameObject("/Filter")] = NameObject("/Standard")
    encrypt[NameObject("/V")] = NumberObject(V)
    if V == 2:
        encrypt[NameObject("/Length")] = NumberObject(keylen * 8)
    encrypt[NameObject("/R")] = NumberObject(rev)
    encrypt[NameObject("/O")] = ByteStringObject(O)
    encrypt[NameObject("/U")] = ByteStringObject(U)
    encrypt[NameObject("/P")] = NumberObject(P)
    writer_obj._encrypt = writer_obj._addObject(encrypt)
    writer_obj._encrypt_key = key


unmeta = PdfFileReader('my_pdf.pdf')

writer = PdfFileWriter()
writer.appendPagesFromReader(unmeta)
encrypt(writer, '1', '123')

with open('my_pdf_encrypted.pdf', 'wb') as fp:
    writer.write(fp)

私の答えが気に入ったら、投票してください;)。

于 2020-07-24T16:41:02.133 に答える
1

PyPDF allows encrypting PDF files.

于 2012-10-28T14:57:26.797 に答える
1

Have you tried The PDF Toolkit, command-line interface (pdftk)?

http://www.pdflabs.com/docs/pdftk-cli-examples/

于 2012-10-28T14:59:29.777 に答える