अजगर में PDFMiner का उपयोग करते हुए एक पीडीएफ फाइल से पाठ निकालना?


89

मैं प्रलेखन या उदाहरणों की तलाश में हूं कि अजगर के साथ PDFMiner का उपयोग करके पीडीएफ फाइल से टेक्स्ट कैसे निकाला जाए।

ऐसा लगता है कि PDFMiner ने अपने API को अपडेट किया है और मेरे द्वारा पाए गए सभी प्रासंगिक उदाहरणों में पुराने कोड (कक्षाएं और तरीके बदल गए हैं) शामिल हैं। जिन पुस्तकालयों में मैंने पाया है कि पीडीएफ फाइल से टेक्स्ट को निकालने का काम आसान हो जाता है, वे पुराने PDFMiner सिंटैक्स का उपयोग कर रहे हैं, इसलिए मुझे यकीन नहीं है कि यह कैसे करना है।

जैसा कि है, मैं सिर्फ सोर्स-कोड देख रहा हूं कि क्या मैं इसे समझ सकता हूं।


1
कृपया पहले, stackoverflow.com/help/how-to-ask और stackoverflow.com/help/mcve और अपने जवाब को अद्यतन तो यह दिशा-निर्देश के लिए एक बेहतर प्रारूप और संरेखित करता है।
पार्कर

आप पायथन के किस वितरण का उपयोग कर रहे हैं, 2.7.x या 3.xx? यह ध्यान दिया जाना चाहिए कि लेखक स्पष्ट रूप से विस्तृत है कि PDFminerपायथन 3.xx के साथ काम नहीं करता है यही कारण हो सकता है कि आप importत्रुटियां प्राप्त कर रहे हैं। pdfminer3kयदि ऐसा है तो आपको इसका उपयोग करना चाहिए , क्योंकि यह उक्त पुस्तकालय का स्थायी पायथन 3 आयात है।
नलदेव

@ नानाशी, क्षमा करें, मैं अपना पायथन संस्करण जोड़ना भूल गया। यह 2.7 है इसलिए यह मुद्दा नहीं है। मैं स्रोत-कोड के माध्यम से देख रहा हूं और ऐसा लग रहा है कि उन्होंने कुछ चीजों का पुनर्गठन किया है जिसके कारण आयात टूट रहा है। मुझे PDFMiner के लिए कोई भी दस्तावेज नहीं मिल रहा है या मैं बस उसी से काम
चलाऊंगा

मैं सिर्फ सचमुच PDFminerGitHub से स्थापित किया है और यह ठीक आयात करता है। क्या आप कृपया अपना कोड डाल सकते हैं और अपनी पूरी त्रुटि ट्रेसबैक भी पोस्ट कर सकते हैं?
नलदेव

@ नानाशी, जैसा कि मैंने अपने मूल प्रश्न में कहा, लाइब्रेरी जो PDFMiner पर भरोसा करती हैं, आयात को खत्म करने से पहले किसी भी उदाहरण के साथ तोड़ती हैं जो मुझे मिल सकता है। यह PDFMiner समस्या नहीं है। यह मैं प्रलेखन, या PDFMiner का उपयोग कैसे करें का एक उदाहरण है। मैं जो कुछ भी पा सकता हूं वह पीडीएफमीटर के लिए एक पुराने सिंटैक्स का उपयोग कर रहा है। मैंने आगे बढ़कर अपने प्रश्न को स्पष्टता से संपादित किया। मुझे लगता है कि मैंने इसे जरूरत से ज्यादा भ्रमित कर दिया। उसके लिए माफ़ करना।
डकपंचर

जवाबों:


184

PDFMiner के वर्तमान संस्करण (सितंबर 2016) का उपयोग करके पीडीएफ फाइल से टेक्स्ट निकालने का एक कार्य उदाहरण यहां दिया गया है।

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

PDFMiner की संरचना हाल ही में बदल गई है, इसलिए इसे पीडीएफ फाइलों से पाठ निकालने के लिए काम करना चाहिए।

संपादित करें : अभी भी 2018 के 7 जून के रूप में काम कर रहा है। पायथन संस्करण 3.x में सत्यापित

संपादित करें: समाधान 3 अक्टूबर, 2019 को पायथन 3.7 के साथ काम करता है। मैंने पायथन पुस्तकालय का उपयोग किया pdfminer.six, नवंबर 2018 को जारी किया गया।


2
ठीक काम करता है, लेकिन, मैं उदाहरण के नामों के लिए रिक्त स्थान से कैसे निपट सकता हूं? मान लें कि मेरे पास एक पीडीएफ है जिसमें 4 कॉलम हैं, जिनमें से पहला और आखिरी नाम एक कॉल में है, अब यह एक पंक्ति में फर्स्टनाम
Deusdeorum

2
वर्तमान में इस कोड के साथ एक आयात त्रुटि हो रही है: ImportError: 'pdfminer.pdfpage' नाम का कोई मॉड्यूल नहीं
जेफरी स्वान

1
धन्यवाद यह अजगर v2.7.12 और ubuntu 16.04 पर काम करता है, हालांकि यह बेहतर होगा कि पीडीएफ दस्तावेज़ को एन्कोडिंग utf-8 के साथ लोड किया जाए, क्योंकि मेरे नमूना pdf में कुछ एन्कोडिंग समस्या है, इसलिए utf-8 के साथ एन्कोडिंग के बाद इसे आज़माएं और यह हल करता है मुद्दा ... import sys reload(sys) sys.setdefaultencoding('utf-8')
sib10

2
@DuckPuncher, क्या यह अभी भी काम कर रहा है? मुझे काम करने के file(path, 'rb')लिए 'ओपन' (पथ, 'आरबी') में बदलना पड़ा ।
craned

2
अभी भी Python3.7 उपयोगकर्ताओं के लिए काम कर रहा है। Pdfminer.six == 20181108 पैकेज स्थापित किया गया। मेरे मामले के लिए अब तक का सबसे अच्छा समाधान और मैंने कई समाधानों की तुलना की।
aze45sq6d

30

DuckPuncher से भयानक जवाब, Python3 के लिए सुनिश्चित करें कि आप pdfminer2 स्थापित करें और करें:

import io

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage


def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos = set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,
                                  password=password,
                                  caching=caching,
                                  check_extractable=True):
        interpreter.process_page(page)



    fp.close()
    device.close()
    text = retstr.getvalue()
    retstr.close()
    return text

1
यह मेरे लिए काम नहीं करता है: ModuleNotFoundError: 'pdfminer.pdfpage' नाम का कोई भी मॉड्यूल मैं python का उपयोग नहीं कर रहा हूँ 3.6
Atti

@Atti, बस मामले में, सुनिश्चित करें कि आपके पास pdfminer2 स्थापित है, क्योंकि एक और पैकेज है pdfminer (मुझे नफरत है)। यह pip3 फ्रीज करते समय pdfminer2 == 20151206 संस्करण के लिए काम करता है।
जुआन इज़ाज़ा

5
धन्यवाद मुझे यह अंततः काम कर रहा है, मैंने कोंडा फोर्ज से pdfminer.six स्थापित किया है
Atti

8
पायथन 3 के लिए, pdfminer.six अनुशंसित पैकेज है - github.com/pdfminer/pdfminer.six
माइक

क्या यह अभी भी चालू है। मुझे वही ImportError:संदेश मिल रहा है

14

यह मई 2020 में Python3 में PDFminer छह का उपयोग करके काम करता है।

पैकेज स्थापित करना

$ pip install pdfminer.six

पैकेज आयात करना

from pdfminer.high_level import extract_text

डिस्क पर सहेजे गए पीडीएफ का उपयोग करना

text = extract_text('report.pdf')

या वैकल्पिक रूप से:

with open('report.pdf','rb') as f:
    text = extract_text(f)

स्मृति में पहले से ही पीडीएफ का उपयोग करना

यदि पीडीएफ पहले से ही स्मृति में है, उदाहरण के लिए यदि अनुरोध लाइब्रेरी के साथ वेब से पुनर्प्राप्त किया गया है, तो इसे ioलाइब्रेरी का उपयोग करके एक स्ट्रीम में परिवर्तित किया जा सकता है :

import io

response = requests.get(url)
text = extract_text(io.BytesIO(response.content))

प्रदर्शन और विश्वसनीयता PyPDF2 के साथ तुलना में

PDFminer.six PyPDF2 (जो कुछ प्रकार के PDF के साथ विफल रहता है) की तुलना में अधिक मज़बूती से काम करता है, विशेष रूप से PDF संस्करण 1.7 में

हालाँकि, PDFminer.six के साथ पाठ निष्कर्षण 6 के कारक द्वारा PyPDF2 की तुलना में काफी धीमा है।

मैंने timeitएक 15 "MBP (2018) के साथ पाठ निष्कर्षण समयबद्ध किया , केवल 10 पृष्ठ पीडीएफ के साथ निष्कर्षण समारोह (कोई फ़ाइल खोलने आदि) का समय नहीं दिया और निम्नलिखित परिणाम प्राप्त किए:

PDFminer.six: 2.88 sec
PyPDF2:       0.45 sec

pdfminer.six में एक विशाल पदचिह्न भी है, जिसमें pycryptodome की आवश्यकता होती है, जिसे 80 MB से 350 MB तक अल्पाइन लिनक्स पर एक न्यूनतम स्थापित डॉक छवि को स्थापित करने वाले GCC और अन्य चीजों की आवश्यकता होती है। PyPDF2 का कोई ध्यान देने योग्य भंडारण प्रभाव नहीं है।


पिछले अद्यतन के बाद से यह दृष्टिकोण टूट सकता है। वर्तमान में ImportError: cannot import name 'open_filename' from 'pdfminer.utils'जब मैं भाग रहा हूं तो त्रुटि हो रही हैfrom pdfminer.high_level import extract_text
आगे

1
अद्यतन: मैंने एक नया वेनव बनाकर और pdfminer.six को पुन: स्थापित करके इसे ठीक किया। मुझे लगता है कि मैंने पहले की कोशिश की अन्य पीडीएफ़ पैकेजों में से एक को किसी तरह से हस्तक्षेप कर रहा था।
आगे पढ़ना

11

पूर्ण प्रकटीकरण, मैं pdfminer.six के अनुरक्षकों में से एक हूं।

आजकल, आपकी आवश्यकताओं के आधार पर, एक पीडीएफ से पाठ निकालने के लिए कई एपि हैं। पर्दे के पीछे, इन सभी का उपयोग लेआउट के विश्लेषण और विश्लेषण के लिए एक ही तर्क का उपयोग करता है।

(सभी उदाहरण अपने पीडीएफ फाइल कहा जाता है मान example.pdf )

कमांड लाइन

यदि आप कमांडलाइन टूल pdf2txt.py का उपयोग करने के बाद सिर्फ एक बार टेक्स्ट निकालना चाहते हैं:

$ pdf2txt.py example.pdf

उच्चस्तरीय आपी

यदि आप पायथन के साथ पाठ निकालना चाहते हैं, तो आप उच्च-स्तरीय एपि का उपयोग कर सकते हैं। यदि आप पाठ को कई PDF से निकालना चाहते हैं, तो यह दृष्टिकोण एक समाधान है।

from pdfminer.high_level import extract_text

text = extract_text('example.pdf')

रचना योग्य आपी

एक रचना योग्य एपीआई भी है जो परिणामस्वरूप वस्तुओं को संभालने में बहुत लचीलापन देता है। उदाहरण के लिए, आप अपने स्वयं के लेआउट एल्गोरिथ्म को लागू कर सकते हैं। यह विधि अन्य उत्तरों में सुझाई गई है, लेकिन मैं इसे केवल तब सुझाऊँगा जब आपको pdfminer.six के व्यवहार को अनुकूलित करने की आवश्यकता होगी।

from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('example.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

print(output_string.getvalue())

0

इस कोड को python 3 के लिए pdfminer के साथ परीक्षण किया गया है (pdfminer-20191125)

from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.layout import LTTextBoxHorizontal

def parsedocument(document):
    # convert all horizontal text into a lines list (one entry per line)
    # document is a file stream
    lines = []
    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.get_pages(document):
            interpreter.process_page(page)
            layout = device.get_result()
            for element in layout:
                if isinstance(element, LTTextBoxHorizontal):
                    lines.extend(element.get_text().splitlines())
    return lines

मेरे पास पीडीएफ फाइलें हैं जिन्हें मैं नाइट्रो प्रो टूल का उपयोग करके परिवर्तित करने में सक्षम हूं। जब मैं यहां पोस्ट किए गए कोड का उपयोग करके उसी पीडीएफ को परिवर्तित करने का प्रयास करता हूं, हालांकि, मुझे आउटपुट मिलता है जो बताता है कि एक अनुमति त्रुटि है। यहाँ आउटपुट है: ('SAGE सोशल साइंस कलेक्शंस से। सभी अधिकार सुरक्षित। \ n \ n \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c' \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c \ x0c ')
b00kgrrl

फाइल स्ट्रीम का क्या मतलब है?
विन्सेंट

@ ओपन के साथ (फाइल, 'आरबी') स्ट्रीम के रूप में: [...]
रोड्रिगो फॉर्मिघिएरी

क्या आप इस फाइल को आदर्श रूप में टेबल / पांडा के रूप में प्राप्त करने का प्रबंधन करते हैं? groupe-psa.com/en/publication/monthly-world-sales-march-2020
नोनो लंदन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.