Tôi là một sinh viên tốt nghiệp gần đây trong toán học thuần túy, người chỉ học vài khóa lập trình cơ bản. Tôi đang thực tập và tôi có một dự án phân tích dữ liệu nội bộ. Tôi phải phân tích các tệp PDF nội bộ của những năm trước. Các tệp PDF được "bảo mật". Nói cách khác, chúng được mã hóa. Chúng tôi không có mật khẩu PDF, thậm chí nhiều hơn, chúng tôi không chắc có tồn tại mật khẩu hay không. Nhưng, chúng tôi có tất cả những tài liệu này và chúng tôi có thể đọc chúng bằng tay. Chúng tôi có thể in chúng là tốt. Mục tiêu là đọc chúng bằng Python vì đây là ngôn ngữ mà chúng tôi có một số ý tưởng.
Đầu tiên, tôi đã cố đọc các tệp PDF với một số thư viện Python. Tuy nhiên, các thư viện Python mà tôi thấy không đọc được các tệp PDF được mã hóa. Vào thời điểm đó, tôi cũng không thể xuất thông tin bằng Adobe Reader.
Thứ hai, tôi quyết định giải mã các tệp PDF. Tôi đã thành công khi sử dụng thư viện Python pykepdf. Pykepdf hoạt động rất tốt! Tuy nhiên, các tệp PDF được giải mã cũng không thể được đọc cùng với các thư viện Python của điểm trước đó ( PyPDF2 và Tabula ). Tại thời điểm này, chúng tôi đã thực hiện một số cải tiến vì sử dụng Adobe Reader tôi có thể xuất thông tin từ các tệp PDF được giải mã, nhưng mục tiêu là làm mọi thứ với Python.
Mã mà tôi đang hiển thị hoạt động hoàn hảo với các tệp PDF không được mã hóa, nhưng không phải với các tệp PDF được mã hóa. Nó không hoạt động với các tệp PDF được giải mã cũng nhận được bằng pykepdf.
Tôi đã không viết mã. Tôi tìm thấy nó trong tài liệu của các thư viện Python Pykepdf và Tabula . Giải pháp PyPDF2 được Al Sweigart viết trong cuốn sách " Tự động hóa các công cụ nhàm chán với Python " mà tôi rất khuyến khích. Tôi cũng đã kiểm tra rằng mã đang hoạt động tốt, với những hạn chế mà tôi đã giải thích trước đó.
Câu hỏi đầu tiên, tại sao tôi không thể đọc các tệp được giải mã, nếu các chương trình hoạt động với các tệp chưa bao giờ được mã hóa?
Câu hỏi thứ hai, bằng cách nào đó chúng ta có thể đọc với Python các tệp được giải mã không? Thư viện nào có thể làm điều đó hoặc là không thể? Có phải tất cả các tệp PDF được giải mã có thể trích xuất?
Cảm ơn bạn đã dành thời gian và sự giúp đỡ của bạn!!!
Tôi đã tìm thấy những kết quả này bằng Python 3.7, Windows 10, Jupiter Notebooks và Anaconda 2019.07.
Python
import pikepdf
with pikepdf.open("encrypted.pdf") as pdf:
num_pages = len(pdf.pages)
del pdf.pages[-1]
pdf.save("decrypted.pdf")
import tabula
tabula.read_pdf("decrypted.pdf", stream=True)
import PyPDF2
pdfFileObj=open("decrypted.pdf", "rb")
pdfReader=PyPDF2.PdfFileReader(pdfFileObj)
pdfReader.numPages
pageObj=pdfReader.getPage(0)
pageObj.extractText()
Với Tabula, tôi nhận được thông báo "tệp đầu ra trống."
Với PyPDF2, tôi chỉ nhận được '/ n'
CẬP NHẬT 10/3/2019 Pdfminer.six (Phiên bản tháng 11 năm 2018)
Tôi đã nhận được kết quả tốt hơn bằng cách sử dụng giải pháp được đăng bởi DuckPuncher . Đối với tệp được giải mã, tôi đã nhận được nhãn, nhưng không phải dữ liệu. Điều tương tự xảy ra với các tập tin được mã hóa. Đối với các tập tin chưa bao giờ được mã hóa hoạt động hoàn hảo. Vì tôi cần dữ liệu và nhãn của các tệp được mã hóa hoặc giải mã, mã này không hoạt động đối với tôi. Để phân tích đó, tôi đã sử dụng pdfminer.six , đó là thư viện Python được phát hành vào tháng 11 năm 2018. Pdfminer.six bao gồm một thư viện pycryptodome. Theo tài liệu của họ " PyCryptodome là gói Python độc lập gồm các nguyên thủy mã hóa cấp thấp .."
Mã nằm trong câu hỏi trao đổi ngăn xếp: Trích xuất văn bản từ tệp PDF bằng PDFMiner trong python?
Tôi rất thích nếu bạn muốn lặp lại thí nghiệm của tôi. Dưới đây là mô tả:
1) Chạy các mã được đề cập trong câu hỏi này với bất kỳ tệp PDF nào chưa bao giờ được mã hóa.
2) Thực hiện tương tự với PDF "Bảo mật" (đây là thuật ngữ mà Adobe sử dụng), tôi gọi đó là PDF được mã hóa. Sử dụng một hình thức chung mà bạn có thể tìm thấy bằng cách sử dụng Google. Sau khi bạn tải xuống, bạn cần điền vào các trường. Nếu không, bạn sẽ kiểm tra nhãn, nhưng không phải các trường. Dữ liệu là trong các lĩnh vực.
3) Giải mã PDF được mã hóa bằng Pykepdf. Đây sẽ là bản PDF được giải mã.
4) Chạy lại mã bằng PDF được giải mã.
CẬP NHẬT 10/4/2019 Camelot (Phiên bản tháng 7 năm 2019)
Tôi tìm thấy thư viện Python Camelot. Hãy cẩn thận rằng bạn cần camelot-py 0.7.3.
Nó rất mạnh và hoạt động với Python 3.7. Ngoài ra, nó rất dễ sử dụng. Đầu tiên, bạn cũng cần cài đặt Ghostscript . Nếu không, nó sẽ không hoạt động. Bạn cũng cần cài đặt Pandas . Không sử dụng pip cài đặt camelot-py . Thay vào đó sử dụng pip cài đặt camelot-py [cv]
Tác giả của chương trình là Vinayak Mehta. Frank Du chia sẻ mã này trong video YouTube "Trích xuất dữ liệu dạng bảng từ PDF bằng Camelot bằng Python."
Tôi đã kiểm tra mã và nó đang làm việc với các tệp không được mã hóa. Tuy nhiên, nó không hoạt động với các tệp được mã hóa và giải mã, và đó là mục tiêu của tôi .
Camelot được định hướng để có được các bảng từ PDF.
Đây là mã:
Python
import camelot
import pandas
name_table = camelot.read_pdf("uncrypted.pdf")
type(name_table)
#This is a Pandas dataframe
name_table[0]
first_table = name_table[0]
#Translate camelot table object to a pandas dataframe
first_table.df
first_table.to_excel("unencrypted.xlsx")
#This creates an excel file.
#Same can be done with csv, json, html, or sqlite.
#To get all the tables of the pdf you need to use this code.
for table in name_table:
print(table.df)
CẬP NHẬT 10/7/2019 Tôi tìm thấy một mẹo. Nếu tôi mở pdf được bảo mật bằng Adobe Reader và tôi in nó bằng Microsoft sang PDF và tôi lưu nó dưới dạng PDF, tôi có thể trích xuất dữ liệu bằng bản sao đó. Tôi cũng có thể chuyển đổi tệp PDF sang JSON, Excel, SQLite, CSV, HTML và các định dạng khác. Đây là một giải pháp có thể cho câu hỏi của tôi. Tuy nhiên, tôi vẫn đang tìm kiếm một tùy chọn để thực hiện nó mà không cần mẹo đó vì mục tiêu là thực hiện 100% với Python. Tôi cũng lo ngại rằng nếu sử dụng một phương pháp mã hóa tốt hơn thì thủ thuật có thể sẽ không hiệu quả. Đôi khi bạn cần sử dụng Adobe Reader nhiều lần để có được một bản sao có thể trích xuất.
CẬP NHẬT 10/8/2019. Câu hỏi thứ ba. Bây giờ tôi có một câu hỏi thứ ba. Tất cả pdf được bảo mật / mã hóa có được bảo vệ bằng mật khẩu không? Tại sao pikepdf không hoạt động? Tôi đoán là phiên bản hiện tại của pikepdf có thể phá vỡ một số loại mã hóa nhưng không phải tất cả chúng. @constt đã đề cập rằng PyPDF2 có thể phá vỡ một số loại bảo vệ. Tuy nhiên, tôi đã trả lời anh ta rằng tôi đã tìm thấy một bài viết rằng PyPDF2 có thể phá vỡ các mã hóa được thực hiện bằng Adobe Acrobat Pro 6.0, nhưng không có phiên bản sau.
qpdf
để giải mã các tập tin của bạn? Trong trường hợp nó sẽ thực hiện thủ thuật, bạn có thể gọi nó từ tập lệnh của mình bằng subprocess
mô-đun để giải mã các tập tin trước khi phân tích chúng.
PyPDF2
, mọi thứ đều hoạt động tốt. Tôi đã sử dụngpdftk
cũng như các dịch vụ trực tuyến để mã hóa tập tin. Bạn có thể gửi liên kết đến các tập tin pdf "rắc rối" không?