Hướng dẫn read pdf python - đọc pdf python

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Cách làm việc với PDF trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: How to Work With a PDF in Python

Định dạng tài liệu di động, hoặc PDF, là một định dạng tệp có thể được sử dụng để trình bày và trao đổi tài liệu một cách đáng tin cậy trên các hệ điều hành. Mặc dù PDF ban đầu được Adobe phát minh ra, nhưng hiện tại đây là một tiêu chuẩn mở được duy trì bởi Tổ chức Tiêu chuẩn hóa Quốc tế (ISO). Bạn có thể làm việc với PDF có sẵn trong Python bằng cách sử dụng gói PyPDF2.PyPDF2 package.

PyPDF2 là gói python thuần túy mà bạn có thể sử dụng cho nhiều loại hoạt động PDF khác nhau.

Đến cuối bài viết này, bạn sẽ biết cách làm như sau:

  • Trích xuất thông tin tài liệu từ PDF trong Python
  • Xoay trang
  • Hợp nhất pdfs
  • Chia PDFS
  • Thêm hình mờ
  • Mã hóa một tệp PDF

Bắt đầu nào!

Lịch sử của pyPdf, PyPDF2 và PyPDF4

Gói pyPdf ban đầu đã được phát hành trở lại vào năm 2005. Bản phát hành chính thức cuối cùng của pyPdf là vào năm 2010. Sau khoảng một năm, một công ty có tên Phasit đã tài trợ cho một ngã ba pyPdf được gọi là PyPDF2. Mã này được viết để tương thích ngược với bản gốc và hoạt động khá tốt trong vài năm, với bản phát hành cuối cùng là vào năm 2016.

Có một loạt các bản phát hành ngắn gọn về một gói có tên

# pdf_merging.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def merge_pdfs(paths, output):
    pdf_writer = PdfFileWriter()

    for path in paths:
        pdf_reader = PdfFileReader(path)
        for page in range(pdf_reader.getNumPages()):
            # Add each page to the writer object
            pdf_writer.addPage(pdf_reader.getPage(page))

    # Write out the merged PDF
    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    paths = ['document1.pdf', 'document2.pdf']
    merge_pdfs(paths, output='merged.pdf')
4, và sau đó dự án được đổi tên thành PyPDF4. Tất cả các dự án này làm khá nhiều điều tương tự, nhưng sự khác biệt lớn nhất giữa pyPdf và PYPDF2+ là các phiên bản sau đã thêm hỗ trợ Python 3. Có một ngã ba Python 3 khác của pyPdf ban đầu cho Python 3, nhưng người ta đã không được duy trì trong nhiều năm.

Trong khi PyPDF2 gần đây đã bị bỏ rơi, ____99 mới không có khả năng tương thích ngược hoàn toàn với PyPDF2. Hầu hết các ví dụ trong bài viết này sẽ hoạt động hoàn toàn tốt với PyPDF4, nhưng có một số ví dụ không thể, đó là lý do tại sao PyPDF4 không nổi bật hơn trong bài viết này. Hãy thoải mái trao đổi nhập khẩu cho PyPDF2 với PyPDF4 và xem nó hoạt động như thế nào cho bạn.

# pdf_splitting.py from PyPDF2 import PdfFileReader, PdfFileWriter def split(path, name_of_split): pdf = PdfFileReader(path) for page in range(pdf.getNumPages()): pdf_writer = PdfFileWriter() pdf_writer.addPage(pdf.getPage(page)) output = f'{name_of_split}{page}.pdf' with open(output, 'wb') as output_pdf: pdf_writer.write(output_pdf) if __name__ == '__main__': path = 'Jupyter_Notebook_An_Introduction.pdf' split(path, 'jupyter_page') 5: Một giải pháp thay thế

Patrick Maupin đã tạo ra một gói có tên

# pdf_splitting.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):
    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output = f'{name_of_split}{page}.pdf'
        with open(output, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    split(path, 'jupyter_page')
5 có thể làm nhiều điều tương tự mà PyPDF2 làm. Bạn có thể sử dụng
# pdf_splitting.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):
    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output = f'{name_of_split}{page}.pdf'
        with open(output, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    split(path, 'jupyter_page')
5 cho tất cả các loại tác vụ giống nhau mà bạn sẽ học cách thực hiện trong bài viết này cho PyPDF2, ngoại trừ đáng chú ý là mã hóa.

Sự khác biệt lớn nhất khi nói đến

# pdf_splitting.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):
    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output = f'{name_of_split}{page}.pdf'
        with open(output, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    split(path, 'jupyter_page')
5 là nó tích hợp với gói Báo cáo để bạn có thể lấy PDF có từ trước và xây dựng một bản mới với Báo cáo bằng cách sử dụng một số hoặc tất cả các PDF có từ trước.

Cài đặt

Cài đặt PyPDF2 có thể được thực hiện với

# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')
2 hoặc
# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')
3 nếu bạn tình cờ sử dụng Anaconda thay vì Python thông thường.

Tại đây, cách bạn sẽ cài đặt PyPDF2 với

# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')
2:

Việc cài đặt khá nhanh vì PyPDF2 không có bất kỳ phụ thuộc nào. Bạn có thể sẽ dành nhiều thời gian để tải xuống gói như bạn sẽ cài đặt.

Bây giờ, hãy để di chuyển và tìm hiểu cách trích xuất một số thông tin từ PDF.

Cách xoay trang

Thỉnh thoảng, bạn sẽ nhận được các tệp PDF có chứa các trang ở chế độ cảnh quan thay vì chế độ chân dung. Hoặc có lẽ họ thậm chí còn lộn ngược. Điều này có thể xảy ra khi ai đó quét tài liệu vào PDF hoặc email. Bạn có thể in tài liệu ra và đọc phiên bản giấy hoặc bạn có thể sử dụng sức mạnh của Python để xoay các trang vi phạm.

Trong ví dụ này, bạn có thể đi và chọn một bài báo Python thực sự và in nó vào PDF.

Hãy cùng học cách xoay một vài trang của bài viết đó với PyPDF2:

# rotate_pages.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def rotate_pages(pdf_path):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(pdf_path)
    # Rotate page 90 degrees to the right
    page_1 = pdf_reader.getPage(0).rotateClockwise(90)
    pdf_writer.addPage(page_1)
    # Rotate page 90 degrees to the left
    page_2 = pdf_reader.getPage(1).rotateCounterClockwise(90)
    pdf_writer.addPage(page_2)
    # Add a page in normal orientation
    pdf_writer.addPage(pdf_reader.getPage(2))

    with open('rotate_pages.pdf', 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    rotate_pages(path)

Đối với ví dụ này, bạn cần nhập

# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')
8 ngoài
# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')
9 vì bạn sẽ cần phải viết ra một bản PDF mới.
# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
0 đi theo con đường đến PDF mà bạn muốn sửa đổi. Trong chức năng đó, bạn sẽ cần tạo một đối tượng nhà văn mà bạn có thể đặt tên cho
# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
1 và một đối tượng đầu đọc có tên
# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
2.

Tiếp theo, bạn có thể sử dụng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
3 để có được trang mong muốn. Ở đây bạn lấy trang Zero, đó là trang đầu tiên. Sau đó, bạn gọi phương thức đối tượng trang
# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
4 và vượt qua 90 độ. Sau đó, cho trang hai, bạn gọi
# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
5 và vượt qua 90 độ.

Sau mỗi cuộc gọi đến các phương thức xoay, bạn gọi

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
6. Điều này sẽ thêm phiên bản xoay của trang vào đối tượng nhà văn. Trang cuối cùng mà bạn thêm vào đối tượng nhà văn là trang 3 mà không có bất kỳ vòng quay nào được thực hiện.

Cuối cùng, bạn viết ra PDF mới bằng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
7. Nó lấy một đối tượng giống như tệp làm tham số của nó. PDF mới này sẽ chứa ba trang. Hai cái đầu tiên sẽ được xoay theo các hướng ngược nhau của nhau và ở trong cảnh quan trong khi trang thứ ba là một trang bình thường.

Bây giờ, hãy để tìm hiểu làm thế nào bạn có thể hợp nhất nhiều tệp PDF thành một.

Cách hợp nhất PDFS

Có nhiều tình huống mà bạn sẽ muốn lấy hai hoặc nhiều tệp PDF và hợp nhất chúng lại với nhau thành một tệp PDF duy nhất. Ví dụ: bạn có thể có một trang bìa tiêu chuẩn cần phải đi vào nhiều loại báo cáo. Bạn có thể sử dụng Python để giúp bạn làm điều đó.

Đối với ví dụ này, bạn có thể mở PDF và in một trang dưới dạng PDF riêng biệt. Sau đó làm điều đó một lần nữa, nhưng với một trang khác. Điều đó sẽ cung cấp cho bạn một vài đầu vào để sử dụng ví dụ như mục đích.

Hãy cùng tiếp tục và viết một số mã mà bạn có thể sử dụng để hợp nhất các tệp PDF cùng nhau:

# pdf_merging.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def merge_pdfs(paths, output):
    pdf_writer = PdfFileWriter()

    for path in paths:
        pdf_reader = PdfFileReader(path)
        for page in range(pdf_reader.getNumPages()):
            # Add each page to the writer object
            pdf_writer.addPage(pdf_reader.getPage(page))

    # Write out the merged PDF
    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    paths = ['document1.pdf', 'document2.pdf']
    merge_pdfs(paths, output='merged.pdf')

Bạn có thể sử dụng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
8 khi bạn có danh sách các tệp PDF mà bạn muốn hợp nhất với nhau. Bạn cũng sẽ cần biết nơi lưu kết quả, vì vậy chức năng này lấy một danh sách các đường dẫn đầu vào và đường dẫn đầu ra.

Sau đó, bạn lặp qua các đầu vào và tạo một đối tượng đầu đọc PDF cho mỗi đối tượng. Tiếp theo, bạn sẽ lặp lại tất cả các trang trong tệp PDF và sử dụng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
6 để thêm từng trang đó vào chính nó.

Khi bạn đã hoàn thành việc lặp lại trên tất cả các trang của tất cả các tệp PDF trong danh sách của bạn, bạn sẽ viết ra kết quả ở cuối.

Một mục tôi muốn chỉ ra là bạn có thể nâng cao tập lệnh này một chút bằng cách thêm vào một loạt các trang sẽ được thêm vào nếu bạn không muốn hợp nhất tất cả các trang của mỗi PDF. Nếu bạn thích một thử thách, bạn cũng có thể tạo giao diện dòng lệnh cho chức năng này bằng mô -đun PythonTHER PyPDF20.

Hãy cùng tìm hiểu làm thế nào để làm ngược lại với sự hợp nhất!

Cách phân chia PDFS

Có những lúc bạn có thể có PDF mà bạn cần chia thành nhiều tệp PDF. Điều này đặc biệt đúng với các tệp PDF có chứa nhiều nội dung được quét, nhưng có rất nhiều lý do chính đáng để muốn chia PDF.

Tại đây, cách bạn có thể sử dụng PyPDF2 để chia tệp PDF của mình thành nhiều tệp:

# pdf_splitting.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):
    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output = f'{name_of_split}{page}.pdf'
        with open(output, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    split(path, 'jupyter_page')

Trong ví dụ này, bạn một lần nữa tạo một đối tượng đầu đọc PDF và lặp qua các trang của nó. Đối với mỗi trang trong PDF, bạn sẽ tạo một thể hiện nhà văn PDF mới và thêm một trang duy nhất vào đó. Sau đó, bạn sẽ viết trang đó ra một tệp được đặt tên duy nhất. Khi tập lệnh được hoàn thành, bạn nên có mỗi trang của PDF gốc chia thành các tệp PDF riêng biệt.

Bây giờ, hãy để Lôi dành một chút thời gian để tìm hiểu làm thế nào bạn có thể thêm hình mờ vào tệp PDF của bạn.

Cách thêm hình mờ

Hình mờ đang xác định hình ảnh hoặc mẫu trên các tài liệu in và kỹ thuật số. Một số hình mờ chỉ có thể được nhìn thấy trong điều kiện ánh sáng đặc biệt. Lý do Watermarking rất quan trọng là nó cho phép bạn bảo vệ tài sản trí tuệ của mình, chẳng hạn như hình ảnh hoặc tệp PDF của bạn. Một thuật ngữ khác cho hình mờ là lớp phủ.

Bạn có thể sử dụng Python và PyPDF2 để đánh dấu các tài liệu của bạn. Bạn cần phải có một tệp PDF chỉ chứa hình ảnh hoặc văn bản hình mờ của bạn.

Hãy cùng học cách thêm một hình mờ ngay bây giờ:

# pdf_watermarker.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def create_watermark(input_pdf, output, watermark):
    watermark_obj = PdfFileReader(watermark)
    watermark_page = watermark_obj.getPage(0)

    pdf_reader = PdfFileReader(input_pdf)
    pdf_writer = PdfFileWriter()

    # Watermark all the pages
    for page in range(pdf_reader.getNumPages()):
        page = pdf_reader.getPage(page)
        page.mergePage(watermark_page)
        pdf_writer.addPage(page)

    with open(output, 'wb') as out:
        pdf_writer.write(out)

if __name__ == '__main__':
    create_watermark(
        input_pdf='Jupyter_Notebook_An_Introduction.pdf', 
        output='watermarked_notebook.pdf',
        watermark='watermark.pdf')

PyPDF23 chấp nhận ba đối số:

  1. PyPDF24: Đường dẫn tệp PDF được ghi hình the PDF file path to be watermarked
  2. PyPDF25: Đường dẫn bạn muốn lưu phiên bản Watermark của PDF the path you want to save the watermarked version of the PDF
  3. PyPDF26: Một tệp PDF chứa hình ảnh hoặc văn bản Watermark của bạn a PDF that contains your watermark image or text

Trong mã, bạn mở PDF Watermark và chỉ lấy trang đầu tiên từ tài liệu vì đó là nơi mà Watermark của bạn nên cư trú. Sau đó, bạn tạo một đối tượng đầu đọc PDF bằng cách sử dụng đối tượng PyPDF24 và một đối tượng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
1 chung để viết ra PDF có hình mờ.

Bước tiếp theo là lặp lại các trang trong PyPDF24. Đây là nơi mà phép thuật xảy ra. Bạn sẽ cần phải gọi PyPDF20 và vượt qua PyPDF21. Khi bạn làm điều đó, nó sẽ phủ lên PyPDF21 trên đầu trang hiện tại. Sau đó, bạn thêm trang mới được hợp nhất đó vào đối tượng

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')
1 của bạn.

Cuối cùng, bạn viết PDF mới được đánh dấu vào đĩa, và bạn đã hoàn thành!

Chủ đề cuối cùng bạn sẽ tìm hiểu là cách PyPDF2 xử lý mã hóa.

Cách mã hóa PDF

PyPDF2 Hiện tại chỉ hỗ trợ thêm mật khẩu người dùng và mật khẩu chủ sở hữu vào PDF có từ trước. Trong PDF Land, mật khẩu chủ sở hữu về cơ bản sẽ cung cấp cho bạn các đặc quyền quản trị viên đối với PDF và cho phép bạn đặt quyền trên tài liệu. Mặt khác, mật khẩu người dùng chỉ cho phép bạn mở tài liệu.

Theo như tôi có thể nói, PyPDF2 không thực sự cho phép bạn đặt bất kỳ quyền nào trên tài liệu mặc dù nó cho phép bạn đặt mật khẩu chủ sở hữu.

Bất kể, đây là cách bạn có thể thêm mật khẩu, vốn cũng sẽ mã hóa PDF:

# pdf_encrypt.py

from PyPDF2 import PdfFileWriter, PdfFileReader

def add_encryption(input_pdf, output_pdf, password):
    pdf_writer = PdfFileWriter()
    pdf_reader = PdfFileReader(input_pdf)

    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))

    pdf_writer.encrypt(user_pwd=password, owner_pwd=None, 
                       use_128bit=True)

    with open(output_pdf, 'wb') as fh:
        pdf_writer.write(fh)

if __name__ == '__main__':
    add_encryption(input_pdf='reportlab-sample.pdf',
                   output_pdf='reportlab-encrypted.pdf',
                   password='twofish')

PyPDF27 thực hiện các đường dẫn PDF đầu vào và đầu ra cũng như mật khẩu mà bạn muốn thêm vào PDF. Sau đó, nó mở một người viết pdf và một đối tượng đọc, như trước đây. Vì bạn sẽ muốn mã hóa toàn bộ PDF đầu vào, bạn sẽ cần phải lặp qua tất cả các trang của nó và thêm chúng vào người viết.

Bước cuối cùng là gọi PyPDF28, lấy mật khẩu người dùng, mật khẩu chủ sở hữu và có nên thêm mã hóa 128 bit hay không. Mặc định là để mã hóa 128 bit được bật. Nếu bạn đặt nó thành PyPDF29, thì mã hóa 40 bit sẽ được áp dụng thay thế.

Sự kết luận

Gói PyPDF2 khá hữu ích và thường khá nhanh. Bạn có thể sử dụng PyPDF2 để tự động hóa các công việc lớn và tận dụng khả năng của nó để giúp bạn thực hiện công việc của mình tốt hơn!

Trong hướng dẫn này, bạn đã học cách làm như sau:

  • Trích xuất siêu dữ liệu từ PDF
  • Xoay trang
  • Hợp nhất và phân chia pdfs
  • Thêm hình mờ
  • Thêm mã hóa

Ngoài ra, hãy để mắt đến gói PyPDF4 mới hơn vì nó có thể sẽ sớm thay thế PyPDF2. Bạn cũng có thể muốn kiểm tra

# pdf_splitting.py

from PyPDF2 import PdfFileReader, PdfFileWriter

def split(path, name_of_split):
    pdf = PdfFileReader(path)
    for page in range(pdf.getNumPages()):
        pdf_writer = PdfFileWriter()
        pdf_writer.addPage(pdf.getPage(page))

        output = f'{name_of_split}{page}.pdf'
        with open(output, 'wb') as output_pdf:
            pdf_writer.write(output_pdf)

if __name__ == '__main__':
    path = 'Jupyter_Notebook_An_Introduction.pdf'
    split(path, 'jupyter_page')
5, có thể thực hiện nhiều điều tương tự mà PyPDF2 có thể làm.

Đọc thêm

Nếu bạn muốn tìm hiểu thêm về việc làm việc với PDFS trong Python, bạn nên kiểm tra một số tài nguyên sau đây để biết thêm thông tin:

  • Trang web PyPDF2
  • Trang GitHub cho PyPDF4
  • Trang GitHub cho
    # pdf_splitting.py
    
    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    def split(path, name_of_split):
        pdf = PdfFileReader(path)
        for page in range(pdf.getNumPages()):
            pdf_writer = PdfFileWriter()
            pdf_writer.addPage(pdf.getPage(page))
    
            output = f'{name_of_split}{page}.pdf'
            with open(output, 'wb') as output_pdf:
                pdf_writer.write(output_pdf)
    
    if __name__ == '__main__':
        path = 'Jupyter_Notebook_An_Introduction.pdf'
        split(path, 'jupyter_page')
    
    5
  • Trang web Báo cáo
  • Trang GitHub cho pyPdf9
  • Camelot: Chiết xuất bảng PDF cho con người
  • Tạo và sửa đổi các tệp PDF trong Python (Hướng dẫn)

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Cách làm việc với PDF trong Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: How to Work With a PDF in Python