2010-11-17 35 views
6

Tôi đang cố gắng sử dụng pyPdf để trích xuất và in các trang từ một tệp PDF nhiều trang. Vấn đề là, văn bản không được trích xuất từ ​​một số trang. Tôi đã đặt một tập tin ví dụ ở đây:pyPdf không thể trích xuất văn bản từ một số trang trong PDF

http://www.4shared.com/document/kmJF67E4/forms.html

Nếu bạn chạy sau, 81 trang đầu quay trở lại không có văn bản, trong khi trận chung kết 11 chiết xuất đúng cách. Có ai giúp được không?

from pyPdf import PdfFileReader 
input = PdfFileReader(file("forms.pdf", "rb")) 
for page in input1.pages: 
    print page.extractText() 

Trả lời

6

Lưu ý rằng extractText() vẫn gặp sự cố khi trích xuất văn bản đúng cách. Từ các tài liệu cho extractText():

này hoạt động tốt đối với một số tập tin PDF, nhưng kém cho người khác, tùy thuộc vào các máy phát điện sử dụng. Đây sẽ là được tinh chỉnh trong tương lai. Không dựa vào thứ tự văn bản sắp ra khỏi chức năng này, vì nó sẽ thay đổi nếu chức năng này trở nên phức tạp hơn.

Vì đây là văn bản bạn muốn, bạn có thể sử dụng lệnh Linux pdftotext.

Để gọi rằng việc sử dụng Python, bạn có thể làm điều này:

>>> import subprocess 
>>> subprocess.call(['pdftotext', 'forms.pdf', 'output']) 

Văn bản được chiết xuất từ ​​forms.pdf và lưu vào output.

Tính năng này hoạt động trong trường hợp tệp PDF của bạn và trích xuất văn bản bạn muốn.

+0

Nhờ sự giúp đỡ của bạn. Tôi đã thử pdftotext và chuyển nó qua vì nó chỉ giải quyết một phần vấn đề. Tôi cần phải chia pdf thành các tệp riêng biệt trên cơ sở UID được tìm thấy trên mỗi trang. Tuy nhiên, 10 trang cuối cùng mà pyPdf có thể trích xuất, không có nhãn trang văn bản, vì vậy hãy sử dụng pdftotext, trong khi nó cung cấp cho tôi tất cả văn bản, không cung cấp cho tôi cách tạo danh sách trang cho UID đã cho . – DrJAKing

+0

Điều này không làm việc xấu khi xuất văn bản PDF, nhưng không bảo toàn định dạng bảng. – s2t2

1

Bạn cũng có thể thử thư viện pdfminer (cũng trong python) và xem liệu có tốt hơn khi trích xuất văn bản hay không. Tuy nhiên, để chia tách, bạn sẽ phải gắn bó với pyPdf vì pdfminer không hỗ trợ điều đó.

+0

Tôi đã thử pdfminer ... các trang sau không được trích xuất đúng cách vì một lý do nào đó. – DrJAKing

0

tôi thấy nó đôi khi hữu ích để chuyển nó sang ps (thử với pdf2pspdftops cho sự khác biệt tiềm năng) sau đó trở lại pdf (ps2pdf). Sau đó thử lại tập lệnh gốc của bạn.

+0

Tôi đã hy vọng, nhưng tất cả nó dường như làm là làm cho tập tin ban đầu lớn hơn và làm chậm việc khai thác văn bản null! – DrJAKing

+0

@DrJAKing: Xin lỗi, nó đã làm việc cho tôi "một số lần", không phải lúc nào. – Danosaure

0

Tôi bắt đầu nghĩ rằng tôi nên áp dụng giải pháp hai phần lộn xộn. có hai phần của tệp PDF, trang 1-82 có nhãn trang văn bản (pdftotext có thể trích xuất) và trang cuối 83 không có nhãn trang nhưng pyPDF có thể trích xuất và nó biết rõ các trang.

Tôi nghĩ tôi cần kết hợp cả hai. Clunky, nhưng tôi không thấy cách nào làm tròn nó. Đáng buồn là tôi phải làm điều này trên một máy Windows.

1

Đây không thực sự là câu trả lời, nhưng vấn đề với pyPdf là điều này: nó chưa hỗ trợ CMaps. PDF cho phép các phông chữ sử dụng CMaps để ánh xạ các ID ký tự (byte trong PDF) sang các mã ký tự Unicode. Khi bạn có tệp PDF chứa các ký tự không phải ASCII, có thể có CMap đang được sử dụng và thậm chí đôi khi không có ký tự không phải ASCII. Khi pyPdf gặp các chuỗi không mã hóa Unicode chuẩn, nó chỉ thấy một chuỗi mã byte; nó không thể chuyển đổi những byte thành Unicode, vì vậy nó chỉ cung cấp cho bạn chuỗi rỗng. Tôi thực sự đã có cùng một vấn đề này và tôi đang làm việc trên mã nguồn vào lúc này. Đó là thời gian, nhưng tôi hy vọng sẽ gửi một bản vá cho người bảo trì một thời gian vào khoảng giữa năm 2011.

0

Tôi có vấn đề tương tự với một số file PDF và cho các cửa sổ, điều này đang làm việc tuyệt vời cho tôi:

1. công cụ Tải xpdf cho các cửa sổ

2. Bản sao pdftotext.exe từ xpdf-cụ- win-4.00 \ bin32 để C: \ Windows \ System32 và cũng để C: \ Windows \ SysWOW64

3. sử dụng tiến trình con để chạy lệnh từ giao diện điều khiển:

import subprocess 

try: 
    extInfo = subprocess.check_output('pdftotext.exe '+filePath + ' -',shell=True,stderr=subprocess.STDOUT).strip() 
except Exception as e: 
    print (e) 
Các vấn đề liên quan