Hướng dẫn how do i search for a word in a pdf using python? - làm cách nào để tìm kiếm một từ trong pdf bằng python?

Vấn đề Tôi đang cố gắng xác định tài liệu loại A nào (ví dụ: nài nỉ, thư từ, trát hầu tòa, v.v.) bằng cách tìm kiếm thông qua văn bản của nó, tốt nhất là sử dụng Python. Tất cả các tệp PDF đều có thể tìm kiếm được, nhưng tôi chưa tìm thấy giải pháp để phân tích cú pháp nó bằng Python và áp dụng tập lệnh để tìm kiếm nó (thiếu việc chuyển đổi nó thành tệp văn bản trước, nhưng đó có thể tốn nhiều tài nguyên cho N tài liệu).
I'm trying to determine what type a document is (e.g. pleading, correspondence, subpoena, etc) by searching through its text, preferably using python. All PDFs are searchable, but I haven't found a solution to parsing it with python and applying a script to search it (short of converting it to a text file first, but that could be resource-intensive for n documents).

Những gì tôi đã làm cho đến nay tôi đã xem xét PYPDF, PDFMiner, tài liệu Adobe PDF và bất kỳ câu hỏi nào ở đây tôi có thể tìm thấy (mặc dù dường như không ai giải quyết trực tiếp vấn đề này). PDFMiner dường như có tiềm năng nhất, nhưng sau khi đọc qua tài liệu, tôi thậm chí không chắc chắn bắt đầu từ đâu.
I've looked into pypdf, pdfminer, adobe pdf documentation, and any questions here I could find (though none seemed to directly solve this issue). PDFminer seems to have the most potential, but after reading through the documentation I'm not even sure where to begin.

Có một phương pháp đơn giản, hiệu quả để đọc văn bản PDF, theo trang, dòng hoặc toàn bộ tài liệu? Hoặc bất kỳ cách giải quyết nào khác?

Đã hỏi ngày 13 tháng 6 năm 2013 lúc 23:07Jun 13, 2013 at 23:07

2

Điều này được gọi là khai thác PDF và rất khó khăn vì:

  • PDF là một định dạng tài liệu được thiết kế để in, không được phân tích cú pháp. Bên trong tài liệu PDF, văn bản không theo thứ tự cụ thể (trừ khi đặt hàng là quan trọng để in), hầu hết thời gian cấu trúc văn bản gốc bị mất (các chữ cái có thể không được nhóm lại là từ và từ có thể không được nhóm lại trong câu và thứ tự Chúng được đặt trong giấy thường là ngẫu nhiên).
  • Có hàng tấn PDF tạo phần mềm, nhiều người bị lỗi.

Các công cụ như pdfminer sử dụng heuristic để nhóm và các từ một lần nữa dựa trên vị trí của chúng trong trang. Tôi đồng ý, giao diện ở mức khá thấp, nhưng nó có ý nghĩa hơn khi bạn biết vấn đề họ đang cố gắng giải quyết (cuối cùng, điều gì quan trọng là lựa chọn cách gần với hàng xóm một chữ cái/từ/từ phải có theo thứ tự được coi là một phần của một đoạn văn).

Một giải pháp thay thế đắt tiền (về thời gian/sức mạnh máy tính) đang tạo ra hình ảnh cho mỗi trang và cho chúng ăn thành OCR, có thể đáng để thử nếu bạn có OCR rất tốt.

Vì vậy, câu trả lời của tôi là không, không có phương pháp đơn giản, hiệu quả để trích xuất văn bản từ các tệp PDF - nếu tài liệu của bạn có cấu trúc đã biết, bạn có thể tinh chỉnh các quy tắc và nhận được kết quả tốt, nhưng nó luôn luôn là một đánh bạc .

Tôi thực sự muốn được chứng minh là sai.

[update]

Câu trả lời không thay đổi nhưng gần đây tôi đã tham gia vào hai dự án: một trong số đó là sử dụng tầm nhìn máy tính để trích xuất dữ liệu từ các hình thức bệnh viện được quét. Các trích đoạn khác dữ liệu từ hồ sơ tòa án. Những gì tôi học được là:

  1. Tầm nhìn máy tính đang ở tầm tay của những người chết trong năm 2018. Nếu bạn có một mẫu tài liệu đã được phân loại tốt, bạn có thể sử dụng OpenCV hoặc Scikit-Image để trích xuất các tính năng và đào tạo trình phân loại máy học để xác định tài liệu loại A nào.

  2. Nếu PDF bạn đang phân tích là "có thể tìm kiếm", bạn có thể trích xuất rất xa tất cả các văn bản bằng phần mềm như PDFTOTEXT và Bộ lọc Bayes (cùng loại thuật toán được sử dụng để phân loại thư rác).

Vì vậy, không có phương pháp đáng tin cậy và hiệu quả để trích xuất văn bản từ các tệp PDF nhưng bạn có thể không cần một phương pháp để giải quyết vấn đề trong tay (phân loại loại tài liệu).

Đã trả lời ngày 14 tháng 6 năm 2013 lúc 0:52Jun 14, 2013 at 0:52

Paulo Scardinepaulo ScardinePaulo Scardine

69,9k11 Huy hiệu vàng124 Huy hiệu bạc150 Huy hiệu đồng11 gold badges124 silver badges150 bronze badges

4

Tôi hoàn toàn là một bàn tay màu xanh lá cây, nhưng kịch bản này làm việc cho tôi:

# import packages import PyPDF2 import re # open the pdf file object = PyPDF2.PdfFileReader("test.pdf") # get number of pages NumPages = object.getNumPages() # define keyterms String = "Social" # extract text and do the search for i in range(0, NumPages): PageObj = object.getPage(i) print("this is page " + str(i)) Text = PageObj.extractText() # print(Text) ResSearch = re.search(String, Text) print(ResSearch)

Đã trả lời ngày 10 tháng 6 năm 2018 lúc 3:46Jun 10, 2018 at 3:46

Emma Yuemma YuEmma Yu

5135 Huy hiệu bạc6 Huy hiệu Đồng5 silver badges6 bronze badges

4

Tôi đã viết các hệ thống rộng lớn cho công ty mà tôi làm việc để chuyển đổi dữ liệu của PDF thành dữ liệu để xử lý (hóa đơn, khu định cư, vé được quét, v.v.) và @paulo Scardine là chính xác-không có cách nào hoàn toàn đáng tin cậy và dễ dàng để làm điều này . Điều đó nói rằng, cách nhanh nhất, đáng tin cậy nhất và ít chuyên sâu nhất là sử dụng pdftotext, một phần của bộ công cụ XPDF. Công cụ này sẽ nhanh chóng chuyển đổi PDF có thể tìm kiếm thành tệp văn bản mà bạn có thể đọc và phân tích bằng Python. Gợi ý: Sử dụng đối số -layout. Và nhân tiện, không phải tất cả các PDF đều có thể tìm kiếm, chỉ có những người chứa văn bản. Một số PDF chỉ chứa hình ảnh không có văn bản nào cả.

Đã trả lời ngày 14 tháng 6 năm 2013 lúc 1:07Jun 14, 2013 at 1:07

MikehuntermikehunterMikeHunter

4.0141 Huy hiệu vàng18 Huy hiệu bạc13 Huy hiệu đồng1 gold badge18 silver badges13 bronze badges

4

Gần đây tôi đã bắt đầu sử dụng Scraperwiki để làm những gì bạn mô tả.

Dưới đây là một ví dụ về việc sử dụng Scraperwiki để trích xuất dữ liệu PDF.

Hàm import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 0 trả về cấu trúc XML.

Sau đó, bạn có thể sử dụng BeautifulSoup để phân tích cú pháp đó vào một cây có thể điều hướng.

Đây là mã của tôi cho -

import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line

Mã này sẽ in một đống thẻ import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 1 lớn. Mỗi trang được phân tách bằng import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 2, nếu đó là bất kỳ sự an ủi nào.

Nếu bạn muốn nội dung bên trong các thẻ import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 1, có thể bao gồm các tiêu đề được bọc trong import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 4 chẳng hạn, hãy sử dụng import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 5

Nếu bạn chỉ muốn từng dòng văn bản, không bao gồm các thẻ, hãy sử dụng import scraperwiki, urllib2 from bs4 import BeautifulSoup def send_Request(url): #Get content, regardless of whether an HTML, XML or PDF file pageContent = urllib2.urlopen(url) return pageContent def process_PDF(fileLocation): #Use this to get PDF, covert to XML pdfToProcess = send_Request(fileLocation) pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) return pdfToObject def parse_HTML_tree(contentToParse): #returns a navigatibale tree, which you can iterate through soup = BeautifulSoup(contentToParse) return soup pdf = process_PDF('//greenteapress.com/thinkstats/thinkstats.pdf') pdfToSoup = parse_HTML_tree(pdf) soupToArray = pdfToSoup.findAll('text') for line in soupToArray: print line 6

Nó lộn xộn và đau đớn, nhưng điều này sẽ làm việc cho các tài liệu PDF có thể tìm kiếm. Cho đến nay tôi đã thấy điều này là chính xác, nhưng đau đớn.

Đã trả lời ngày 14 tháng 11 năm 2015 lúc 7:38Nov 14, 2015 at 7:38

JastonachairjastonachairJasTonAChair

1.9081 Huy hiệu vàng18 Huy hiệu bạc 30 Huy hiệu Đồng1 gold badge18 silver badges30 bronze badges

2

Đây là giải pháp mà tôi thấy nó thoải mái cho vấn đề này. Trong biến văn bản, bạn nhận được văn bản từ PDF để tìm kiếm trong đó. Nhưng tôi cũng đã giữ ý tưởng phun văn bản trong các từ khóa như tôi đã tìm thấy trên trang web này: //medium.com/@rqaiserr/how-to-convert-pdfs-into-wearchable-key-words-with-python -85AAB86C544F Từ tôi đã lấy giải pháp này, mặc dù việc tạo NLTK không đơn giản lắm, nó có thể hữu ích cho các mục đích tiếp theo:

import PyPDF2 import textract from nltk.tokenize import word_tokenize from nltk.corpus import stopwords def searchInPDF(filename, key): occurrences = 0 pdfFileObj = open(filename,'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj) num_pages = pdfReader.numPages count = 0 text = "" while count < num_pages: pageObj = pdfReader.getPage(count) count +=1 text += pageObj.extractText() if text != "": text = text else: text = textract.process(filename, method='tesseract', language='eng') tokens = word_tokenize(text) punctuation = ['(',')',';',':','[',']',','] stop_words = stopwords.words('english') keywords = [word for word in tokens if not word in stop_words and not word in punctuation] for k in keywords: if key == k: occurrences+=1 return occurrences pdf_filename = '/home/florin/Downloads/python.pdf' search_for = 'string' print searchInPDF (pdf_filename,search_for)

Đã trả lời ngày 1 tháng 12 năm 2017 lúc 12:12Dec 1, 2017 at 12:12

Tôi đồng ý với việc khai thác dữ liệu PDF @paulo là một nỗi đau lớn. Nhưng bạn có thể thành công với pdftotext, một phần của bộ XPDF có sẵn miễn phí tại đây:

//www.foolabs.com/xpdf/download.html

Điều này là đủ cho mục đích của bạn nếu bạn chỉ đang tìm kiếm các từ khóa duy nhất.

pdftotext là một tiện ích dòng lệnh, nhưng rất đơn giản để sử dụng. Nó sẽ cung cấp cho bạn các tệp văn bản, mà bạn có thể thấy dễ dàng hơn để làm việc.

Đã trả lời ngày 14 tháng 6 năm 2013 lúc 1:02Jun 14, 2013 at 1:02

qwwqwwqqwwqwwqqwwqwwq

6.6612 Huy hiệu vàng24 Huy hiệu bạc48 Huy hiệu đồng2 gold badges24 silver badges48 bronze badges

Nếu bạn đang sử dụng bash, có một công cụ đẹp gọi là PDFGREP, vì, đây là trong kho lưu trữ APT, bạn có thể cài đặt nó với:

sudo apt install pdfgrep

Nó đã phục vụ tốt yêu cầu của tôi.

Đã trả lời ngày 13 tháng 7 năm 2020 lúc 12:31Jul 13, 2020 at 12:31

Appaji Chintimiappaji ChintimiAppaji Chintimi

4961 Huy hiệu vàng6 Huy hiệu bạc17 Huy hiệu đồng1 gold badge6 silver badges17 bronze badges

Cố gắng chọn thông qua các tệp PDF cho các từ khóa không phải là một điều dễ dàng để làm. Tôi đã cố gắng sử dụng thư viện PDFMiner với thành công rất hạn chế. Về cơ bản, các tệp PDF là đại dịch khi nói đến cấu trúc. Mọi thứ trong PDF đều có thể tự đứng hoặc là một phần của phần ngang hoặc dọc, ngược hoặc về phía trước. PDFMiner đang gặp vấn đề dịch một trang, không nhận ra phông chữ, vì vậy tôi đã thử một hướng khác - nhận dạng ký tự quang học của tài liệu. Điều đó đã làm việc gần như hoàn hảo.

WAND chuyển đổi tất cả các trang riêng biệt trong PDF thành các đốm hình ảnh, sau đó bạn chạy OCR qua các đốm hình ảnh. Những gì tôi có dưới dạng đối tượng byte là nội dung của tệp PDF từ yêu cầu web. Bytesio là một đối tượng phát trực tuyến mô phỏng tải tệp như thể đối tượng đang ra khỏi đĩa, mà Wand yêu cầu là tham số tệp. Điều này cho phép bạn chỉ cần lấy dữ liệu trong bộ nhớ thay vì phải lưu tệp vào đĩa trước và sau đó tải nó.

Ở đây, một khối mã rất cơ bản có thể giúp bạn đi. Tôi có thể hình dung các chức năng khác nhau sẽ lặp qua các URL / tệp khác nhau, các tìm kiếm từ khóa khác nhau cho mỗi tệp và các hành động khác nhau cần thực hiện, thậm chí có thể cho mỗi từ khóa và tệp.

# //docs.wand-py.org/en/0.5.9/ # //www.imagemagick.org/script/formats.php # brew install freetype imagemagick # brew install PIL # brew install tesseract # pip3 install wand # pip3 install pyocr import pyocr.builders import requests from io import BytesIO from PIL import Image as PI from wand.image import Image if __name__ == '__main__': pdf_url = '//www.vbgov.com/government/departments/city-clerk/city-council/Documents/CurrentBriefAgenda.pdf' req = requests.get(pdf_url) content_type = req.headers['Content-Type'] modified_date = req.headers['Last-Modified'] content_buffer = BytesIO(req.content) search_text = 'tourism investment program' if content_type == 'application/pdf': tool = pyocr.get_available_tools()[0] lang = 'eng' if tool.get_available_languages().index('eng') >= 0 else None image_pdf = Image(file=content_buffer, format='pdf', resolution=600) image_jpeg = image_pdf.convert('jpeg') for img in image_jpeg.sequence: img_page = Image(image=img) txt = tool.image_to_string( PI.open(BytesIO(img_page.make_blob('jpeg'))), lang=lang, builder=pyocr.builders.TextBuilder() ) if search_text in txt.lower(): print('Alert! {} {} {}'.format(search_text, txt.lower().find(search_text), modified_date)) req.close()

Đã trả lời ngày 10 tháng 5 năm 2020 lúc 15:10May 10, 2020 at 15:10

Câu trả lời này sau @emma Yu's:

Nếu bạn muốn in ra tất cả các trận đấu của một mẫu chuỗi trên mỗi trang. (Lưu ý rằng mã của Emma in một khớp trên mỗi trang):
(Note that Emma's code prints a match per page):

import PyPDF2 import re pattern = input("Enter string pattern to search: ") fileName = input("Enter file path and name: ") object = PyPDF2.PdfFileReader(fileName) numPages = object.getNumPages() for i in range(0, numPages): pageObj = object.getPage(i) text = pageObj.extractText() for match in re.finditer(pattern, text): print(f'Page no: {i} | Match: {match}')

Đã trả lời ngày 29 tháng 11 năm 2020 lúc 13:53Nov 29, 2020 at 13:53

Một phiên bản sử dụng pymupdf. Tôi thấy nó mạnh hơn PYPDF2.

import fitz import re # load document doc = fitz.open(filename) # define keyterms String = "hours" # get text, search for string and print count on page. for page in doc: text = '' text += page.getText() print(f'count on page {page.number +1} is: {len(re.findall(String, text))}')

Đã trả lời ngày 12 tháng 11 năm 2021 lúc 18:45Nov 12, 2021 at 18:45

CamcamCam

1.08310 Huy hiệu bạc16 Huy hiệu đồng10 silver badges16 bronze badges

Ví dụ với pdfminer.six

from pdfminer import high_level with open('file.pdf', 'rb') as f: text = high_level.extract_text(f) print(text)

So với PYPDF2, nó có thể hoạt động với Cyrillic

Đã trả lời ngày 28 tháng 12 năm 2021 lúc 0:05Dec 28, 2021 at 0:05

RugnarrugnarRugnar

2.7062 huy hiệu vàng21 Huy hiệu bạc29 Huy hiệu đồng2 gold badges21 silver badges29 bronze badges

Làm cách nào để trích xuất một từ cụ thể từ PDF trong Python?

Bước 1: Nhập tất cả các thư viện. Step 2: Convert PDF file to txt format and read data. Step 3: Use “. findall()” function of regular expressions to extract keywords.

Làm cách nào để tạo PDF có thể tìm kiếm trong Python?

Chuyển đổi PDF được quét thành PDF có thể tìm kiếm trong Python..
Thêm tệp thư mục ..
Yêu cầu cài đặt mô -đun ..
Khóa API của bạn ..
Tệp nguồn và tên tệp PDF ..
Chạy chương trình Python ..
PDF làm cho văn bản có thể tìm kiếm được demo API ..

Làm cách nào để tìm một từ cụ thể trong PDF?

Khi PDF được mở trong đầu đọc Acrobat (không có trong trình duyệt), khung cửa sổ tìm kiếm có thể hoặc không thể hiển thị.Để hiển thị khung cửa sổ Tìm kiếm/Tìm, hãy sử dụng "Ctrl+F".use "Ctrl+F".

Làm cách nào để đọc một văn bản cụ thể từ PDF trong Python?

Đối tượng đầu đọc pdf có chức năng getPage () lấy số trang (chỉ mục biểu mẫu bắt đầu 0) làm đối số và trả về đối tượng trang.Đối tượng trang có chức năng trích xuất () để trích xuất văn bản từ trang PDF.

Chủ đề