Làm cách nào để trích xuất văn bản từ PDF? [đóng cửa]


152

Bất cứ ai cũng có thể giới thiệu một thư viện / API để trích xuất văn bản và hình ảnh từ PDF? Chúng tôi cần có thể nhận được văn bản có trong các khu vực được biết đến trước của tài liệu, do đó API sẽ cần cung cấp cho chúng tôi thông tin vị trí của từng thành phần trên trang.

Chúng tôi muốn dữ liệu đó là đầu ra xmlhoặc jsonđịnh dạng. Hiện tại chúng tôi đang xem PdfTextStream có vẻ khá tốt, nhưng muốn nghe những kinh nghiệm và đề xuất của người khác.

Có những lựa chọn thay thế (thương mại hoặc miễn phí) để trích xuất văn bản từ pdf theo chương trình không?



1
Đối với những người cần một cái gì đó thực sự đơn giản (không có thông tin vị trí), regex perl này có thể đủ : /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mg. Nó chỉ tìm toán tử Tj / TJ, biểu thị tất cả văn bản bình thường trong tệp PDF.
Alex R

1
sử dụng thư viện TomRoush PdfBox, nó hoạt động tốt trên Android
FaisalAhmed 17/03/2017

Câu trả lời:


113

Tôi đã nhận được một tệp pdf 400 trang với một bảng dữ liệu mà tôi phải nhập - may mắn là không có hình ảnh. Ghostscript làm việc cho tôi:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

Tệp đầu ra được chia thành các trang có tiêu đề, v.v., nhưng sau đó thật dễ dàng để viết một ứng dụng để loại bỏ các dòng trống, v.v., và hút tất cả 30.000 bản ghi. -dSIMPLE-dCOMPLEXkhông có sự khác biệt trong trường hợp này.


37
Trên linux và cygwin, lệnh gsthay vì gswin64c. Hoạt động hoàn hảo. Không có bằng sáng chế trả tiền tào lao. Nó chỉ hoạt động.
Jannes

4
Yup, hoạt động tuyệt vời! Bây giờ tôi có thể sử dụng "grep" không bị trừng phạt trên các tệp pdf của mình. Vì tôi có thể grep tốt hơn tôi có thể đọc, đó là một chiến thắng! (:-) Upvote.
David Elson

1
Vấn đề duy nhất tôi gặp phải với điều này là sử dụng nó trên pdf với các phông chữ 'cũ' được nhúng. Hoạt động hoàn hảo cho các tệp pdf được tạo cục bộ, nhưng khó hơn với các nguồn tối nghĩa. Nếu không, một scriptlet xuất sắc.
Jon M

những gì -sDEVICE=txtwritelàm gì? Tôi không hiểu nhiều sau khi đọc Cách sử dụng Ghostscript | Chọn một thiết bị đầu ra
Ooker

Đối với đầu ra xuất chuẩn thay vì lưu dưới dạng tệp văn bản, hãy sử dụng gswin64c -sDEVICE=txtwrite -o- input.pdf. Nguồn (thay đổi một chút bởi tôi): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

Vì hôm nay tôi biết điều đó: điều tốt nhất để trích xuất văn bản từ PDFTET, bộ công cụ trích xuất văn bản . TET là một phần của dòng sản phẩm PDFlib.com.

PDFlib.com là công ty của Thomas Merz. Trong trường hợp bạn không nhận ra tên anh ấy: Thomas Merz là tác giả của "Kinh thánh PostScript và PDF".

Hóa thân đầu tiên của TET là một thư viện . Người ta có thể có thể làm mọi thứ Budda006 muốn, bao gồm thông tin vị trí về mọi yếu tố trên trang. Oh, và nó cũng có thể trích xuất hình ảnh. Nó kết hợp lại hình ảnh được phân mảnh thành từng mảnh.

pdflib.com cũng cung cấp một hóa thân khác của công nghệ này, plugin TET cho Acrobat . Và hóa thân thứ ba là PDFlib TET iFilter . Đây là một công cụ độc lập cho máy tính để bàn của người dùng. Cả hai đều miễn phí (như trong bia) để sử dụng cho mục đích riêng tư, phi thương mại.

Và nó thực sự mạnh mẽ. Cách tốt hơn so với trích xuất văn bản của Adobe. Nó trích xuất văn bản cho tôi khi các công cụ khác (bao gồm cả Adobe) chỉ nhổ rác.

Tôi vừa thử nghiệm công cụ độc lập trên máy tính để bàn và những gì họ nói trên trang web của họ là đúng. Nó có một dòng lệnh rất tốt. Một số tệp kiểm tra PDF "có vấn đề" của tôi, công cụ xử lý hoàn toàn hài lòng.

Điều này từ bây giờ sẽ là đề xuất của tôi cho mọi yêu cầu trích xuất văn bản PDF phức tạp và đầy thách thức.

TET đơn giản là tuyệt vời. Nó phát hiện các bảng. Bên trong các bảng, nó xác định các ô trải dài trên nhiều cột. Nó xác định các hàng của bảng và nội dung của từng ô của bảng một cách riêng biệt. Nó xử lý rất tốt với các dấu gạch nối: nó loại bỏ các dấu gạch nối và khôi phục các từ hoàn chỉnh. Nó hỗ trợ các ngôn ngữ không phải ASCII (bao gồm cả CJK, tiếng Ả Rập và tiếng Do Thái). Khi gặp chữ ghép, nó khôi phục các ký tự gốc ...

Hãy thử một lần.


32
Không có phiên bản dùng thử và 440 đô la hơi nhiều để "Hãy dùng thử".
Rok Strniša


Dịch vụ này có sẵn thông qua API không?
bart

1
tôi đã thử nó, nó không nhận ra cột. Tôi quét một trang báo lá cải tiếng Anh. Văn bản được chia thành 3 cột trên tờ giấy, nhưng plugin này trộn lẫn các câu hoàn toàn làm cho nó trông thật kỳ quặc. Ghostscript miễn phí có đầu ra chính xác.
NoWhereToBeSeen

1
@RedHotScalability: Cũng là BTW, TET sẽ nhận ra colums nếu được sử dụng với các tham số chính xác. Nhưng tôi để nó như là một bài tập cho người viết kịch bản đầy tham vọng để đọc tài liệu và tìm hiểu làm thế nào ...
Kurt Pfeifle

29

Một công cụ dòng lệnh hiệu quả, mã nguồn mở, miễn phí, có sẵn trên cả linux & windows: có tên đơn giản là pdftotext. Công cụ này là một phần của thư viện xpdf.

http://en.wikipedia.org/wiki/Pdftotext


4
Trên một sidenote: sử dụng công -layouttắc để bảo quản các bảng, hoạt động khá tốt.
sebastian


12

Đây là gợi ý của tôi. Nếu bạn muốn trích xuất văn bản từ PDF, bạn có thể nhập tệp pdf vào Google Docs, sau đó xuất nó sang định dạng thân thiện hơn như .html, .odf, .rtf, .txt, v.v. Tất cả điều này sử dụng API Drive . Nó là miễn phí * và mạnh mẽ. Hãy xem:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

Vì là API còn lại, nên nó tương thích với TẤT CẢ các ngôn ngữ lập trình. Các liên kết tôi đã đăng aboove có các ví dụ hoạt động cho nhiều ngôn ngữ bao gồm: Java, .NET, Python, PHP, Ruby và các ngôn ngữ khác.

Tôi hy vọng nó sẽ giúp.


2
Tôi đã sử dụng tùy chọn đó và tôi sẽ không đề xuất nó. Trích xuất văn bản pdf của Google không tốt bằng nhiều lựa chọn thay thế (đặc biệt là không phải tiếng Anh) và nó cũng rất rất chậm.
Bjorn Lindqvist

10

PdfTextStream (mà bạn nói rằng bạn đã xem) hiện miễn phí cho các ứng dụng luồng đơn. Theo tôi, chất lượng của nó tốt hơn nhiều so với các thư viện khác (đặc biệt đối với những thứ như phông chữ nhúng thú vị, v.v.).

Ngoài ra, bạn nên xem Apache PDFBox , nguồn mở.


PdfTextStream không được hỗ trợ trong Android. Có một số thư viện tốt như thế này có sẵn cho Android?
FaisalAhmed ngày

@FaisalAhmed còn PDFBox thì sao?
Đổi mới

Có PdfBox cũng không được hỗ trợ trong Android .... cả PdfTextStream và PdfBox đều sử dụng một số phần awt không được hỗ trợ trong Android
FaisalAhmed

Tôi đang sử dụng thư viện này hoạt động tốt trên Android github.com/TomRoush/PdfBox-Android
FaisalAhmed 17/03/2017


6

Một trong những ý kiến ​​ở đây đã sử dụng gs trên Windows. Tôi cũng đã thành công với điều đó trên Linux / OSX, với cú pháp sau:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

Tôi đã sử dụng dSIMPLEthay dCOMPLEXvì bởi vì sau này xuất ra 1 ký tự trên mỗi dòng.


5

Vì câu hỏi cụ thể là về các công cụ thay thế để lấy dữ liệu từ PDF dưới dạng XML, do đó bạn có thể quan tâm đến công cụ thương mại "ByteScout PDF Extractor SDK" có khả năng thực hiện chính xác điều này: trích xuất văn bản từ PDF dưới dạng XML cùng với dữ liệu định vị (x, y) và thông tin phông chữ:

Văn bản trong nguồn PDF:

Products | Units | Price 

XML đầu ra:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: ngoài ra, nó cũng chia văn bản thành một cấu trúc dựa trên bảng.

Tiết lộ: Tôi làm việc cho ByteScout


3

Điều tốt nhất hiện tại tôi có thể nghĩ đến (trong danh sách các công cụ "đơn giản") là Ghostscript (phiên bản hiện tại là v.8.71) và chương trình tiện ích PostScript ps2ascii.ps. Ghostscript gửi nó trong libthư mục con của nó . Hãy thử điều này (trên Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

Lệnh này xử lý các trang 3-7 của input.pdf. Đọc các bình luận trong ps2ascii.pschính tệp để xem các số "lạ" và các thông tin bổ sung có ý nghĩa gì ( chúng chỉ ra các chuỗi, vị trí, độ rộng, màu sắc, hình ảnh, hình chữ nhật, phông chữ và ngắt trang ... ). Để có được đầu ra văn bản "đơn giản", thay thế -dCOMPLEXphần bằng -dSIMPLE.


2
Như bạn đoán, điều này chỉ xuất ra thử nghiệm ASCII. Mặc dù miễn phí, không phải là một lựa chọn tuyệt vời cho phần mềm mà bạn dự định sử dụng với các ngôn ngữ khác ngoài tiếng Anh.
userx

3
@userx: Như bạn có thể đoán, đây là phần mềm miễn phí: do đó có sẵn mã nguồn. Có thể gia hạn để hỗ trợ cho người không phải ASCII ...
Kurt Pfeifle

@userx: hôm nay tôi đã phát hiện ra 'TET', Bộ công cụ trích xuất văn bản từ pdflib.com. Xem câu trả lời khác của tôi.
Kurt Pfeifle

ps2ascii từ Ghostscript 9.07 hoạt động rất tốt trên hệ thống OpenBSD của tôi. Tôi vừa chuyển đổi một tệp PDF 526 trang thành văn bản thuần túy. Bây giờ tôi có thể dễ dàng grep và trích xuất văn bản cho ghi chú. Tôi đã sử dụng lệnh đơn giản ps2ascii book.pdf notes.txt. Nếu tài liệu của bạn chủ yếu là ASCII, bạn sẽ gặp may.
Clint Pachl

3

Tôi biết rằng chủ đề này khá cũ, nhưng nhu cầu này vẫn còn sống. Tôi đọc nhiều tài liệu, diễn đàn và kịch bản và xây dựng một bản nâng cao mới hỗ trợ pdf nén và không nén:

https://gist.github.com/smalot/6183152

Trong một số trường hợp, dòng lệnh bị cấm vì lý do bảo mật. Vì vậy, một lớp PHP bản địa có thể phù hợp với nhiều nhu cầu.

Hy vọng nó sẽ giúp





0

Trên các hệ thống Macintosh của tôi, tôi thấy rằng "Adobe Reader" hoạt động khá tốt. Tôi đã tạo một bí danh trên Máy tính để bàn của mình trỏ đến "Adobe Reader.app" và tất cả những gì tôi làm là thả tệp pdf vào bí danh, làm cho nó trở thành tài liệu hoạt động trong Adobe Reader, sau đó từ menu Tệp, Tôi chọn "Lưu dưới dạng văn bản ...", đặt tên và nơi lưu nó, nhấp vào "Lưu" và tôi đã hoàn tất.


5
OP đã tìm kiếm một giải pháp để trích xuất văn bản từ pdf theo lập trình . Câu trả lời của bạn đề xuất một thói quen thủ công thay thế.
mkl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.