Cách mã hóa và giải mã file PDF bằng Python

Python có thể giúp bạn mã hóa và giải mã file PDF dễ dàng. Dưới đây là chi tiết cách mã hóa và giải mã file PDF bằng Python.

Lập trình Python

Vấn nạn bị xâm phạm các tập tin riêng tư khá phổ biến ngày nay. Vì thế, để đảm bảo chỉ những người được phép mới có thể truy cập nội dung file, bạn có thể mã hóa chúng trước khi gửi đi.

Thiết lập môi trường

Để làm theo các bước dưới đây, bạn cần có kiến thức cơ bản về Python.

Trên một terminal Mac hoặc giao diện dòng lệnh Windows, chạy lệnh sau để cài thư viện PyMuPDF:

pip install PyMuPDF

Thư viện này sẽ giúp bạn mở và chỉnh sửa file PDF.

Giải mã file PDF

Khi đã hoàn tất cài đặt PyMuPDF, bạn đã sẵn sàng lập trình.

Nhập Fitz Module

Nhập mô đun Fitz của thư viện PyMuPDF. Điều này sẽ cho phép bạn gọi và dùng các hàm mà nó hỗ trợ.

Import fitz

Bạn sẽ dùng fitz để mở, mã hóa, giải mã và lưu PDF.

Kiểm tra mã hóa của file PDF

Tạo một hàm kiểm tra mức độ mã hóa của PDF và trả về một giá trị boolean.

def pdf_is_encrypted(file):
    pdf = fitz.Document(file)
    return pdf.isEncrypted

Bạn sẽ dùng hàm này sau đó, để giúp chương trình tự động quyết định xem mã hóa hay giải mã PDF nhập vào.

Mã hóa PDF

Tạo một hàm để mã hóa PDF đầu vào. Hàm này cho bạn biết PDF đã được mã hóa hay chưa. Nếu chưa, nó sẽ mã hóa file bằng thuật toán AES-256. Đây là thuật toán mã hóa mạnh nhất mà fitz cung cấp. Cuối cùng, nó sẽ lưu PDF được mã hóa.

def encrypt_pdf_file(pdf, password, outfile, file):
    if not pdf_is_encrypted(file):
        perm = int(
            # Ensure everyone with the PDF
            # can access it
            fitz.PDF_PERM_ACCESSIBILITY 
            | fitz.PDF_PERM_PRINT # permits printing
            | fitz.PDF_PERM_COPY # permits copying
            | fitz.PDF_PERM_ANNOTATE # permits annotations
        )

        # eEncryption algorithm
        encrypt_meth = fitz.PDF_ENCRYPT_AES_256 

        pdf.save(outfile, encryption=encrypt_meth, user_pw=password,
                 permissions=perm)

        if pdf.save:
            print("PDF encrypted")

Hàm này lưu PDF được mã hóa vào đường dẫn file bạn chuyển đi trong đối số tệp ngoài.

Lưu file PDF đã mã hóa

Giải mã PDF

Tạo một hàm giải mã. Hàm này đầu tiên sẽ kiểm tra xem file nhập vào có được mã hóa hay không. Nếu được mã hóa, nó sẽ nhắc người dùng nhập mật khẩu. Sau đó, nó sẽ thử mở PDF bằng mật khẩu được cung cấp. Nếu password đúng, fitz sẽ giải mã PDF. Sau đó, nó sẽ lưu nội dung của PDF được giải mã vào file PDF chưa được bảo vệ.

def decrypt_pdf(file):
    if pdf_is_encrypted(file):
        password = input('Enter pdf password : ')
        pdf = fitz.open(file)

        if pdf.authenticate(password):
            pdf.save('decrypted.pdf')

            if pdf.save:
                print("PDF decrypted")
        else:
            print('Incorrect Password')

Code này lưu PDF chưa được bảo vệ vào thư mục làm việc hiện tại.

Lưu file PDF

Sau khi giải mã file protected.pdf thành công, nó sẽ được lưu dưới dạng decrypted.pdf.

Kiểm soát luồng chương trình

Tạo một hàm chính sẽ kiểm soát luồng chương trình. Nó sẽ lưu đường dẫn của PDF nhập vào, gọi hàm mã hóa, giải mã và chuyển các tham số nhập vào.

def main():
    # replace the file path with either that of
    # the pdf to be encrypted or decrypted 
    file = 'sample.pdf'
    pdf = fitz.open(file)
    password = 'pass123'
    encrypt_pdf_file(pdf, password, 'protected.pdf', file)
    decrypt_pdf(pdf)

Để thay đổi tên của file PDF được mã hóa, thay thế protected.pdf bằng tên bạn muốn nhưng nhớ giữ nguyên định dạng .pdf.

Chạy phương thức chính

Đảm bảo phương thức chính (main) chạy trước:

if __name__ == '__main__':
    main()

Code này kiểm tra xem tập lệnh có đang được chạy dưới dạng chương trình chính chứ không phải mô-đun đã nhập hay không. Nếu là chương trình chính, nó sẽ gọi hàm main.

Tạo chương trình mã hóa/giải mã PDF trong Python là một dự án thú vị nhưng thử thách. Nó giúp bạn rèn luyện kỹ năng Python và làm chủ kỹ năng xử lý tập tin bằng ngôn ngữ này.

Thứ Bảy, 11/02/2023 10:50
51 👨 1.049
0 Bình luận
Sắp xếp theo
    ❖ Python