【Python】PDFを暗号化する

機能

PDFを暗号化するPythonプログラムです。

サンプル動画

youtu.be

プログラム

#! python3
# 機能
#  PDFを暗号化する
# 使い方
#  1.Pythonを実行する
# 実行コマンド
#  python pdf_encrypter.py 入力フォルダ 出力フォルダ パスワード
#  python pdf_encrypter.py input output password

import os
import sys
import PyPDF2

def encrypt_pdf(src, enc, password):
    print('暗号化中:', src, '->', enc)

    with open(src, 'rb') as src_file:
        src_reader = PyPDF2.PdfFileReader(src_file, strict=False)
        if src_reader.isEncrypted:
            print('エラー:すでに暗号化されています。', src)
            return False
        
        enc_writer = PyPDF2.PdfFileWriter()
        for i in range(src_reader.numPages):
            enc_writer.addPage(src_reader.getPage(i))

        with open(enc, 'wb') as enc_file:
            enc_writer.encrypt(password)
            enc_writer.write(enc_file)

    return True

def verify_pdf(src, enc, password):
    print('検証中:', enc)

    with open(enc, 'rb') as enc_file:
        enc_reader = PyPDF2.PdfFileReader(enc_file, strict=False)
        if not enc_reader.isEncrypted:
            print('エラー:暗号化されていません。', enc)
            return False
        
        if not enc_reader.decrypt(password):
            print('エラー:暗号を解除できません。', password)
            return False

        with open(src, 'rb') as src_file:
            src_reader = PyPDF2.PdfFileReader(src_file, strict=False)
            if src_reader.numPages != enc_reader.numPages:
                print('エラー:ページ内容が異なります。', src, enc)
                return False
            
            for i in range(src_reader.numPages):
                src_text = src_reader.getPage(i).extractText()
                enc_text = enc_reader.getPage(i).extractText()
                if src_text != enc_text:
                    print('エラー:ページ内容が異なります。', src, enc)
                    return False

    return True

def walk_encrypt_pdf(input_folder, output_folder, password):
    os.makedirs(output_folder, exist_ok=True)

    for file_name in os.listdir(input_folder):
        if not file_name.lower().endswith('.pdf'):
            continue

        input_file = os.path.join(input_folder, file_name)
        output_file = os.path.join(output_folder, file_name)

        if encrypt_pdf(input_file, output_file, password):
            verify_pdf(input_file, output_file, password)

if len(sys.argv) != 4:
    sys.exit('使い方:python pdf_encrypter.py 入力フォルダ 出力フォルダ パスワード')

walk_encrypt_pdf(sys.argv[1], sys.argv[2], sys.argv[3])

使い方

  1. Pythonを実行する

実行コマンド

python pdf_encrypter.py 入力フォルダ 出力フォルダ パスワード
python pdf_encrypter.py input output password

参考文献

www.oreilly.co.jp