Cách đọc tệp PDF bằng Python

By JoeVu, at: 17:53 Ngày 01 tháng 12 năm 2023

Thời gian đọc ước tính: __READING_TIME__ minutes

How to Read PDF Files with Python
How to Read PDF Files with Python

Mở đầu

 

Python, với bộ thư viện đa dạng, giúp các nhà phát triển trích xuất thông tin từ các tập tin PDF một cách hiệu quả. Trong hướng dẫn toàn diện này, chúng ta sẽ khám phá các thư viện Python khác nhau (các tính năng được hỗ trợ, ưu điểm và nhược điểm), bao gồm cả viên ngọc thường bị bỏ sót, pdfplumber, để nâng cao khả năng đọc PDF của bạn.

 

Hiểu về Tập tin PDF

 

Cấu trúc PDF

 

Để điều hướng sự phức tạp của việc thao tác PDF, việc hiểu cấu trúc tập tin là rất quan trọng. PDF bao gồm văn bản, hình ảnh, siêu dữ liệu và các yếu tố tương tác, tạo thành một hệ thống phân cấp phức tạp.

Ví dụ: PyPDF2 là một công cụ tuyệt vời cho các tập tin PDF không cấu trúc

 

Trích xuất văn bản

 

Nền tảng của việc thao tác PDF nằm ở việc trích xuất văn bản. Chúng ta sẽ thảo luận các phương pháp để trích xuất văn bản một cách hiệu quả, xem xét các sắc thái của các cấu trúc PDF khác nhau. Hầu hết các thư viện đều hỗ trợ tính năng trích xuất văn bản, một số có thể giữ nguyên định dạng văn bản.

 

Các Thư viện để Thao tác PDF trong Python

 

1. PyPDF2

 

Đoạn mã:

import PyPDF2

with open('example.pdf', 'rb') as file:
    pdf_reader = PyPDF2.PdfFileReader(file)
    text = ""
    for page_num in range(pdf_reader.numPages):
        page = pdf_reader.getPage(page_num)
        text += page.extractText()

 


Ưu điểm:

 

  • Đơn giản và dễ sử dụng cho các tác vụ cơ bản.
     
  • Tốt để hợp nhất và tách các PDF.
     

Nhược điểm:

 

  • Hỗ trợ hạn chế cho các tính năng nâng cao.
     

2. pdfminer.six

 

Đoạn mã:

 

from pdfminer.high_level import extract_text

text = extract_text('example.pdf')


Ưu điểm:

 

  • Xử lý hiệu quả các cấu trúc PDF phức tạp.
     
  • Cung cấp thông tin chi tiết trích xuất.
     

Nhược điểm:

 

  • Khó khăn hơn đối với người mới bắt đầu.
     

3. PyMuPDF

 

Đoạn mã:

 

import fitz  # PyMuPDF

doc = fitz.open('example.pdf')
text = ""
for page_num in range(doc.page_count):
    page = doc[page_num]
    text += page.get_text()


Ưu điểm:

 

  • Tuyệt vời để xử lý cả văn bản và hình ảnh.
     
  • Hiệu quả và nhẹ.
     

Nhược điểm:
 

  • Hỗ trợ hạn chế cho các tính năng tương tác.
     

4. pdfplumber

 

Đoạn mã:

 

import pdfplumber

with pdfplumber.open('example.pdf') as pdf:
    text = ""
    for page in pdf.pages:
        text += page.extract_text()

 


Ưu điểm:

 

  • Dễ sử dụng và thân thiện với người dùng.
     
  • Cung cấp chức năng cho bảng và hình ảnh.
     

Nhược điểm:

 

  • Có thể không phù hợp với các PDF rất phức tạp.

 

Đọc Nội dung Văn bản PDF

 

Trích xuất văn bản cơ bản

 

Chúng ta sẽ bắt đầu với một ví dụ đơn giản sử dụng PyPDF2 để trích xuất văn bản từ một PDF. Việc hiểu các phương pháp cơ bản này tạo tiền đề cho các kỹ thuật nâng cao hơn.

 

import PyPDF2

# Mở tập tin PDF ở chế độ nhị phân
with open('example.pdf', 'rb') as file:
    # Tạo một đối tượng đọc PDF
    pdf_reader = PyPDF2.PdfFileReader(file)

    # Khởi tạo một chuỗi rỗng để lưu trữ văn bản đã trích xuất
    text = ""

    # Lặp qua từng trang trong PDF
    for page_num in range(pdf_reader.numPages):
        # Lấy trang
        page = pdf_reader.getPage(page_num)

        # Trích xuất văn bản từ trang và thêm vào chuỗi 'text'
        text += page.extractText()

# In văn bản đã trích xuất
print(text)

 

Xử lý văn bản được mã hóa

 

Chúng ta sẽ khám phá các kỹ thuật để xử lý các vấn đề mã hóa một cách uyển chuyển, tập trung vào pdfminer.six vì khả năng xử lý các cấu trúc văn bản phức tạp của nó.

 

from pdfminer.high_level import extract_text

# Chỉ định đường dẫn đến tập tin PDF có văn bản được mã hóa
pdf_path = 'encoded_text_example.pdf'

# Trích xuất văn bản sử dụng pdfminer.six
text = extract_text(pdf_path, codec='utf-8')

# In văn bản đã trích xuất
print(text)

 

Trích xuất Hình ảnh từ PDF

 

Sử dụng PyMuPDF để trích xuất hình ảnh

 

Ngoài văn bản, PDF thường chứa các hình ảnh có giá trị. PyMuPDF cung cấp một giải pháp mạnh mẽ để trích xuất hình ảnh, và chúng ta sẽ chứng minh việc triển khai của nó.

 

import fitz  # PyMuPDF

# Chỉ định đường dẫn đến tập tin PDF có hình ảnh
pdf_path = 'pdf_with_images.pdf'

# Mở tập tin PDF
doc = fitz.open(pdf_path)

# Lặp qua từng trang trong PDF
for page_num in range(doc.page_count):
    # Lấy trang
    page = doc[page_num]

    # Lấy hình ảnh trên trang
    images = page.get_images(full=True)

    # Lặp qua từng hình ảnh trên trang
    for img_index, img_info in enumerate(images):
        # Lấy dữ liệu hình ảnh
        img_index = img_info[0]
        base_image = doc.extract_image(img_index)
        image_bytes = base_image["image"]

        # Chỉ định tên tập tin hình ảnh (bạn có thể tùy chỉnh tên)
        image_filename = f"page{page_num + 1}_image{img_index}.{base_image['ext']}"

        # Lưu hình ảnh vào tập tin
        with open(image_filename, "wb") as image_file:
            image_file.write(image_bytes)

# Đóng tập tin PDF
doc.close()

 

pdfplumber để trích xuất hình ảnh

 

Đừng quên pdfplumber. Chúng ta sẽ trình bày cách pdfplumber đơn giản hóa việc trích xuất hình ảnh và thảo luận về những lợi thế của nó.

 

import pdfplumber

# Chỉ định đường dẫn đến tập tin PDF có hình ảnh
pdf_path = 'pdf_with_images.pdf'

# Mở tập tin PDF bằng pdfplumber
with pdfplumber.open(pdf_path) as pdf:
    # Lặp qua từng trang trong PDF
    for page_number in range(len(pdf.pages)):
        # Lấy trang
        page = pdf.pages[page_number]

        # Lấy hình ảnh trên trang
        images = page.images

        # Lặp qua từng hình ảnh trên trang
        for image_index, image in enumerate(images):
            # Lấy dữ liệu hình ảnh
            image_data = image['data']

            # Chỉ định tên tập tin hình ảnh (bạn có thể tùy chỉnh tên)
            image_filename = f"page{page_number + 1}_image{image_index + 1}.{image['ext']}"

            # Lưu hình ảnh vào tập tin
            with open(image_filename, "wb") as image_file:
                image_file.write(image_data)

 

Xử lý định dạng hình ảnh

 

Hình ảnh được trích xuất có nhiều định dạng khác nhau. Việc hiểu cách xử lý các định dạng hình ảnh khác nhau đảm bảo tích hợp liền mạch vào quy trình làm việc của bạn.

 

Các Kỹ thuật Nâng cao

 

Làm việc với siêu dữ liệu PDF

 

Mở khóa thông tin ẩn trong PDF bằng cách khám phá siêu dữ liệu. Việc trích xuất các chi tiết như tác giả, ngày tạo và từ khóa thêm ngữ cảnh có giá trị cho dữ liệu của bạn.

 

import fitz  # PyMuPDF

# Chỉ định đường dẫn đến tập tin PDF
pdf_path = 'example.pdf'

# Mở tập tin PDF
doc = fitz.open(pdf_path)

# Lấy siêu dữ liệu tài liệu
metadata = doc.metadata

# In siêu dữ liệu tài liệu
print("Tiêu đề:", metadata.get('title', 'N/A'))
print("Tác giả:", metadata.get('author', 'N/A'))
print("Chủ đề:", metadata.get('subject', 'N/A'))
print("Người tạo:", metadata.get('creator', 'N/A'))
print("Nhà sản xuất:", metadata.get('producer', 'N/A'))
print("Ngày tạo:", metadata.get('created', 'N/A'))
print("Ngày sửa đổi:", metadata.get('modified', 'N/A'))

# Đóng tập tin PDF
doc.close()

 

Các tính năng và biểu mẫu tương tác

 

Điều hướng thế giới của các PDF tương tác và tìm hiểu cách xử lý dữ liệu biểu mẫu bằng lập trình.

 

import fitz  # PyMuPDF

# Chỉ định đường dẫn đến tập tin PDF có biểu mẫu
pdf_path = 'interactive_pdf_with_forms.pdf'

# Mở tập tin PDF
doc = fitz.open(pdf_path)

# Lặp qua từng trang trong PDF
for page_num in range(doc.page_count):
    # Lấy trang
    page = doc[page_num]

    # Kiểm tra xem trang có trường biểu mẫu hay không
    if page.formWidgetAnnots():
        print(f"Trang {page_num + 1} có các tính năng tương tác:")

        # Lặp qua từng trường biểu mẫu trên trang
        for form_field in page.formWidgetAnnots():
            field_name = form_field.field_name
            field_value = form_field.get_text("")

            print(f"Tên trường: {field_name}, Giá trị trường: {field_value}")

        print("\n")

# Đóng tập tin PDF
doc.close()

 

Thực hành tốt nhất để đọc PDF hiệu quả trong Python

 

Quản lý bộ nhớ

 

Việc sử dụng bộ nhớ hiệu quả là rất quan trọng, đặc biệt là khi xử lý các tập tin PDF lớn. Chúng ta sẽ chia sẻ các thực hành tốt nhất để tối ưu hóa quản lý bộ nhớ.

 

  1. Xử lý từng trang: Thay vì tải toàn bộ PDF vào bộ nhớ cùng một lúc, hãy xem xét xử lý từng trang một. Phương pháp này giảm thiểu lượng bộ nhớ sử dụng, làm cho việc xử lý các tài liệu lớn khả thi hơn.
     

  2. Giải phóng tài nguyên: Hãy giải phóng tài nguyên và đóng các tập tin PDF một cách rõ ràng khi chúng không còn cần thiết nữa. Việc quên đóng tập tin có thể dẫn đến rò rỉ bộ nhớ, gây ra việc tiêu thụ tài nguyên hệ thống không cần thiết.
     

  3. Kỹ thuật luồng: Triển khai các kỹ thuật luồng cho các PDF lớn, cho phép ứng dụng đọc và xử lý dữ liệu thành các khối nhỏ hơn, dễ quản lý hơn. Phương pháp này làm giảm nhu cầu về bộ nhớ hệ thống.
     

  4. Cơ chế lưu trữ cache: Sử dụng cơ chế lưu trữ cache một cách có chọn lọc để lưu trữ dữ liệu được truy cập thường xuyên hoặc dữ liệu cần thiết, tránh việc phải tải lại cùng một thông tin từ tập tin PDF nhiều lần.
     

  5. Thư viện được tối ưu hóa: Chọn các thư viện xử lý PDF ưu tiên hiệu quả sử dụng bộ nhớ. Một số thư viện được thiết kế đặc biệt để xử lý các tài liệu lớn với tác động tối thiểu đến bộ nhớ.
     

 

Xử lý lỗi

 

Việc đọc PDF có thể không thể đoán trước. Triển khai xử lý lỗi mạnh mẽ để làm cho mã của bạn có khả năng phục hồi trước các trường hợp bất ngờ.

 

Tối ưu hóa mã cho các PDF lớn

 

Khám phá các chiến lược để tối ưu hóa mã của bạn để xử lý các PDF lớn một cách nhanh chóng, tránh các sai lầm thường gặp.

Việc tối ưu hóa mã cho các PDF lớn là rất quan trọng để đảm bảo xử lý hiệu quả và khả năng đáp ứng trong ứng dụng Python của bạn. Xử lý các tài liệu lớn đòi hỏi các chiến lược chu đáo để giảm thiểu việc tiêu thụ tài nguyên và cải thiện hiệu suất tổng thể. Dưới đây là những điều cần xem xét khi tối ưu hóa mã cho các PDF lớn:

 

  1. Xử lý từng trang: Thay vì tải toàn bộ PDF vào bộ nhớ, hãy áp dụng phương pháp xử lý từng trang một. Phương pháp này cho phép bạn trích xuất thông tin có chọn lọc, giảm thiểu lượng bộ nhớ sử dụng.
     

  2. Tải lười: Triển khai các kỹ thuật tải lười, chỉ tải các thành phần cần thiết khi cần. Phương pháp này hoãn việc phân bổ tài nguyên cho đến khi các phần tử cụ thể, chẳng hạn như trang hoặc hình ảnh, được truy cập.
     

  3. Đọc theo từng đoạn: Chia nhỏ các PDF lớn thành các đoạn nhỏ hơn hoặc các phần để xử lý dễ dàng hơn. Điều này có thể đặc biệt hiệu quả đối với các tác vụ như trích xuất văn bản, nơi xử lý các phần của tài liệu theo trình tự là khả thi.
     

  4. Các hoạt động không đồng bộ: Tận dụng lập trình không đồng bộ để song song hóa các hoạt động, cho phép xử lý đồng thời các phần khác nhau của PDF. Điều này có thể làm tăng hiệu suất đáng kể, đặc biệt là khi xử lý các hệ thống đa lõi.
     

  5. Nội dung luồng: Sử dụng các kỹ thuật luồng để xử lý nội dung từng phần mà không cần tải hoàn toàn vào bộ nhớ. Điều này đặc biệt hữu ích cho các tác vụ như trích xuất văn bản và có thể ngăn ngừa tràn bộ nhớ.
     

  6. Tái chế tài nguyên: Giải phóng tài nguyên một cách rõ ràng ngay khi chúng không còn cần thiết nữa. Thực hành này giúp ngăn ngừa rò rỉ bộ nhớ và đảm bảo sử dụng tài nguyên hiệu quả trong suốt quy trình xử lý PDF.
     

  7. Thư viện được tối ưu hóa: Chọn hoặc phát triển các thư viện được tối ưu hóa để xử lý các PDF lớn. Một số thư viện được thiết kế đặc biệt để quản lý bộ nhớ hiệu quả và xử lý các tài liệu có kích thước khác nhau mà không ảnh hưởng đến hiệu suất.
     

  8. Điều khiển phân trang: Nếu có thể, hãy xem xét phân trang nội dung PDF một cách động dựa trên tương tác của người dùng. Điều này đảm bảo rằng chỉ các phần có liên quan được xử lý, giảm tổng khối lượng công việc.
     

 

Nâng cao độ chính xác trích xuất văn bản

 

Điều chỉnh kỹ thuật trích xuất văn bản của bạn để đảm bảo độ chính xác, đặc biệt là khi xử lý các bố cục phức tạp.

 

Kết luận

 

Được trang bị kiến thức từ hành trình này, giờ đây bạn đã sẵn sàng để điều hướng sự phức tạp của PDF bằng Python. Từ việc trích xuất văn bản cơ bản đến xử lý các tính năng phức tạp, bạn có thể trích xuất thông tin bạn cần một cách tự tin.

 

Câu hỏi thường gặp

 

  1. Tôi có thể sử dụng pdfplumber độc quyền để thao tác PDF không?
     

    • Mặc dù pdfplumber là một công cụ mạnh mẽ, nhưng việc chọn thư viện phụ thuộc vào các yêu cầu cụ thể của bạn. Hãy xem xét các tính năng được cung cấp bởi mỗi thư viện đã thảo luận để có một giải pháp phù hợp.
       
  2. Pdfplumber đơn giản hóa việc trích xuất hình ảnh như thế nào so với các thư viện khác?
     

    • Pdfplumber cung cấp một giao diện thân thiện với người dùng được thiết kế đặc biệt để trích xuất hình ảnh và bảng từ PDF, đơn giản hóa quy trình so với các thư viện khác.
       
  3. Pdfplumber có phù hợp với người mới bắt đầu không?
     

    • Có, sự đơn giản của pdfplumber làm cho nó dễ tiếp cận đối với người mới bắt đầu trong khi vẫn cung cấp các khả năng nâng cao cho các nhà phát triển có kinh nghiệm hơn.
       
  4. Pdfplumber có xử lý được các cấu trúc PDF phức tạp không?
     

    • Pdfplumber rất giỏi trong việc xử lý các cấu trúc PDF khác nhau, làm cho nó phù hợp với nhiều tác vụ thao tác PDF.
       
  5. Có bất kỳ hạn chế nào khi sử dụng pdfplumber không?
     

    • Mặc dù pdfplumber là một công cụ mạnh mẽ, nhưng giống như bất kỳ thư viện nào khác, nó cũng có thể có những hạn chế. Luôn tham khảo tài liệu và xem xét trường hợp sử dụng cụ thể của bạn.

 

Tag list:
- python
- pdf text extraction
- pdfminer.six
- pdf reader
- pdf
- PyMuPDF
- pdfplumber
- pdf extract
- PyPDF2
- pdf images extraction

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.