Cách đọc nhiều tệp pdf từ một thư mục trong python

Giả sử bạn đang trích xuất thông tin từ hóa đơn PDF. Biểu thức chính quy phụ thuộc vào mẫu của PDF. Để trích xuất số tiền hóa đơn, hãy sử dụng một biểu thức chính quy. Đối với số hóa đơn, hãy sử dụng số khác và lưu chúng vào các biến. Tùy thuộc vào cấu trúc của pdf, thậm chí một biểu thức chính quy có thể được sử dụng để trích xuất nhiều thông tin

Sau khi trích xuất tất cả các thông tin cần thiết từ PDF, bạn đã ghi nó vào một hàng dữ liệu của Bảng dữ liệu. Sử dụng Thêm hàng dữ liệu cho nó

Gần đây tôi đang làm việc trên một dự án RPA yêu cầu xử lý nhiều tệp PDF. Có bốn nhiệm vụ chủ yếu liên quan

  1. Kết hợp nhiều tệp PDF thành một tệp duy nhất
  2. Tách một tệp PDF nhiều trang thành nhiều tệp PDF một trang
  3. Chuyển đổi tệp PDF [một trang hoặc nhiều trang] thành tệp PNG
  4. Sử dụng OCR để chuyển đổi tệp PNG thành văn bản

Mục đích cuối cùng là đổi tên các tệp PDF được quét dựa trên nội dung của chúng. Tôi sẽ thực hiện các bước để giải quyết 3 nhiệm vụ đầu tiên ở đây, đối với phần OCR, có nhiều tùy chọn có sẵn nhưng lưu ý, nhiều trong số chúng không hoạt động tốt với các ký tự tiếng Trung, ví dụ như Tesseract, ngay cả với

Nếu không có Python, chúng tôi phải sử dụng Adobe Acrobat Professional để kết hợp và chia nhỏ các tệp PDF hoặc tìm một số dịch vụ trực tuyến có nguy cơ mất thông tin bảo mật. Nhưng chúng ta có thể dễ dàng thực hiện điều này bằng Python với chi phí bằng không và bảo mật tối đa cộng với hiệu quả

Tìm gói phù hợp

Ban đầu, tôi đã thử gói

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
2 mà tôi đã sử dụng để điền vào các biểu mẫu PDF, tuy nhiên, gói này không phù hợp để đọc các tài liệu PDF được quét. Sau khi tìm kiếm, gói tôi tìm thấy là
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
3 [https. //github. com/pymupdf/PyMuPDF], nó phục vụ mọi mục đích tôi có ở đây, bao gồm kết hợp, chia nhỏ tệp PDF và chuyển đổi từng trang thành tệp PNG

Để cài đặt

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
3 , tất cả những gì bạn cần làm là
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
5 , tuy nhiên bạn thực sự cần phải
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
6 để sử dụng nó, đây là một điều kỳ lạ vì bạn cần phải nhớ hai tên gói khác nhau. Thủ thuật tôi đã sử dụng là để lại nhận xét sau dòng nhập

import fitz # pip install pymupdf
Kết hợp nhiều tệp PDF

Để kết hợp nhiều tệp PDF, trước tiên bạn cần tạo một tệp PDF trống bằng cách sử dụng

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
0, sau đó lưu nó sau khi chèn từng tệp PDF vào tệp mới

Giả sử bạn có tất cả các tệp PDF với đường dẫn đầy đủ được lưu trữ trong danh sách

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
1, 3 dòng mã sau đạt được mục đích trên

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
Chia tệp PDF thành nhiều trang

Để tách một tệp PDF nhiều trang, ý tưởng gần giống như bài tập trước, bạn chỉ cần mở một tệp PDF hiện có và chèn vào một loạt các tệp mới theo từng trang

9 dòng mã sau đạt được mục đích trên

with fitz.open[pdf_file] as doc:
digits = len[str[doc.page_count]]
for i, page in enumerate[doc]:
page_id = f'{{:0{digits}}}'.format[i+1]
file_name = f'{os.path.split[pdf_file][1][:-4]}_p{page_id}.pdf'
file_name = os.path.join[save_to, file_name]
with fitz.open[] as doc_tmp:
doc_tmp.insert_pdf[doc, from_page=i, to_page=i, rotate=-1, show_progress=False]
doc_tmp.save[file_name]

Dòng thứ 2 và thứ 4 tính toán tổng số trang và nối thêm

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
2 đến
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
3 vào tên tệp nếu có ít hơn 10 trang hoặc
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
4 đến
with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
5 nếu có từ 10 đến 99 trang, v.v. Đó là một cách thực hành tốt hơn nếu bạn muốn giữ tên tệp theo thứ tự bất cứ khi nào bạn cần truy cập chúng theo cách thủ công hoặc bằng mã

Chuyển đổi tệp PDF sang [các] tệp PNG

Với vấn đề truy cập từng trang của tệp PDF đã được giải quyết ở trên, chúng ta chỉ cần sử dụng đoạn mã sau để chuyển đổi một trang thành tệp PNG

trans = fitz.Matrix[1.0, 1.0].prerotate[0] # zoom_x, zoom_y
pm = page.get_pixmap[matrix=trans, alpha=False]
pm.save[png_file]

Kết hợp với bài tập liệt kê trang trước, ta có đoạn mã hoàn chỉnh sau

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
0

Dòng mã thứ 4 đến thứ 8 tạo hậu tố cho tên tệp PNG nếu có nhiều trang, nếu không thì chỉ tên tệp PDF gốc có phần mở rộng

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
6

Phòng cải tiến

Bạn có thể bọc các mã trên thành các hàm hoặc thậm chí là một lớp để dễ truy cập chúng hơn

Và có những lĩnh vực khác mà bạn có thể khám phá, chẳng hạn như bạn có thể trích xuất TOC, chú thích, v.v. từ PDF bằng gói

with fitz.open[] as doc:
for pdf_file in pdf_files:
doc.insert_pdf[fitz.open[pdf_file], from_page=0, to_page=-1, rotate=-1, show_progress=True, final=True]
doc.save[save_as]
3

Làm cách nào để đọc tất cả các tệp trong thư mục Python?

Để có danh sách tất cả các tệp và thư mục trong một thư mục cụ thể trong hệ thống tệp, hãy sử dụng os. listdir[] trong các phiên bản cũ của Python hoặc os. scandir[] trong Python 3 .

Làm cách nào để trích xuất dữ liệu từ 100 tệp PDF trong 2 phút bằng Python?

Trước tiên, chúng ta cần nhập lib PyPDF2 bằng mã này. nhập PyPDF2 dưới dạng pdf và cẩn thận với phân biệt chữ hoa chữ thường. Sau đó xác định đường dẫn của thư mục bằng os. listdir['the path'] và bạn nên đặt tên cho nó là i. e. đường dẫn = os. listdir['đường dẫn']

Chủ Đề