পাইথনে পিডিএফমাইনার ব্যবহার করে একটি পিডিএফ ফাইল থেকে পাঠ্য আহরণ করা হচ্ছে?


89

পাইথনের সাথে পিডিএফ মাইনার ব্যবহার করে কীভাবে পিডিএফ ফাইল থেকে পাঠ্য আহরণ করতে হয় তার নথিপত্র বা উদাহরণগুলির সন্ধান করছি ।

দেখে মনে হচ্ছে পিডিএফমিনার তাদের এপিআই আপডেট করেছে এবং আমি যে প্রাসঙ্গিক উদাহরণ পেয়েছি তাতে পুরানো কোড রয়েছে (ক্লাস এবং পদ্ধতিগুলি পরিবর্তিত হয়েছে)। আমি যে লাইব্রেরিগুলিতে খুঁজে পেয়েছি যে পিডিএফ ফাইল থেকে পাঠ্য উত্তোলনের কাজটিকে সহজ করে তোলে তা পুরানো পিডিএফ মাইনার সিনট্যাক্স ব্যবহার করছে সুতরাং এটি কীভাবে করবেন তা আমি নিশ্চিত নই।

যেমনটি হ'ল, আমি কেবল উত্স-কোডের দিকে তাকিয়ে দেখছি যে আমি এটি বের করতে পারি কিনা।


4
দয়া করে স্ট্যাকওভারফ্লো.com / help/ how - to- ask এবং stackoverflow.com/help/mcve দেখুন এবং আপনার উত্তর আপডেট করুন যাতে এটি আরও ভাল ফর্ম্যাটে থাকে এবং গাইডলাইনগুলিতে সারিবদ্ধ হয়।
পার্কার 19

পাইথনের কোন বিতরণ আপনি 2.7.x বা 3.xX ব্যবহার করছেন? এটি লক্ষ করা উচিত যে লেখক স্পষ্টভাবে বিশদভাবে লিখেছেন যে PDFminerপাইথন ৩.০ xxx এর সাথে কাজ করে না এটি আপনার importত্রুটি হওয়ার কারণ হতে পারে । আপনার pdfminer3kযদি তাই হয় তবে এটি ব্যবহার করা উচিত , কারণ এটি লাইব্রেরির স্থায়ী পাইথন 3 আমদানি।
নালদেভ

@ নানশি, দুঃখিত, আমি আমার পাইথন সংস্করণ যুক্ত করতে ভুলে গেছি। এটি 2.7 তাই এটি সমস্যা নয়। আমি উত্স-কোডটি সন্ধান করেছি এবং দেখে মনে হচ্ছে তারা কিছু জিনিস পুনর্গঠন করেছে যার কারণে আমদানিগুলি ভেঙে যাচ্ছে। আমি পিডিএফ মাইনারের জন্য কোনও ডকুমেন্টেশন পাচ্ছি না বা আমি কেবল
এটির

আমি আক্ষরিকভাবে PDFminerগিটহাব থেকে ইনস্টল করেছি এবং এটি সূক্ষ্ম আমদানি করে। আপনি কি দয়া করে আপনার কোড পোস্ট করতে পারেন এবং পাশাপাশি আপনার সম্পূর্ণ ত্রুটি ট্রেসব্যাক পোস্ট করতে পারেন?
নালদেভ

@ নানশি, যেমন আমি আমার মূল প্রশ্নে বলেছিলাম, যে লাইব্রেরিগুলি পিডিএফ মাইনারের উপর নির্ভর করে সেগুলি আমদানি শেষ করার আগে বিরতি দেয় এবং আমার যে উদাহরণ খুঁজে পেতে পারে তার সাথে রয়েছে। এটি পিডিএফ মাইনারের সমস্যা নয়। এটি আমি নথিপত্র বা পিডিএফমিনার কীভাবে ব্যবহার করব তার একটি উদাহরণ খুঁজছি। আমি যা কিছু পেতে পারি তা পিডিএফমিনারটির জন্য একটি পুরানো বাক্য গঠন ব্যবহার করে। আমি এগিয়ে গিয়ে সাফতার জন্য আমার প্রশ্নটি সম্পাদনা করেছি। আমি মনে করি এটি হওয়ার চেয়ে বেশি বিভ্রান্তি তৈরি করেছি made এর জন্যে দুঃখিত.
ডাকপঞ্চে

উত্তর:


184

পিডিএফ ফাইল থেকে পাঠ্য উত্তোলনের একটি কার্যকারী উদাহরণ এখানে রয়েছে পিডিএফ মাইনারের বর্তমান সংস্করণ (সেপ্টেম্বর 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

পিডিএফ মাইনারের কাঠামোটি সম্প্রতি পরিবর্তিত হয়েছে, সুতরাং এটি পিডিএফ ফাইলগুলি থেকে পাঠ্য আহরণের জন্য কাজ করা উচিত।

সম্পাদনা করুন : 2018 সালের 7 ই জুনের মতো এখনও কাজ করছে Py পাইথন সংস্করণ 3.x এ যাচাই করা হয়েছে

সম্পাদনা করুন: সমাধানটি পাইথন 3.7 এর সাথে 3 অক্টোবর, 2019 এ কাজ করে I আমি পাইথন লাইব্রেরিটি pdfminer.sixনভেম্বর 2018 এ প্রকাশ করেছি।


4
ভাল কাজ করে, তবে, উদাহরণস্বরূপ নামগুলিতে আমি কীভাবে স্পেসগুলি মোকাবেলা করতে পারি? ধরুন আমার কাছে একটি পিডিএফ রয়েছে যেখানে 4 টি কলাম রয়েছে যেখানে আমি প্রথম এবং এক কলামে
সর্বশেষ নাম

4
বর্তমানে এই কোডটি দিয়ে আমদানি ত্রুটি পেয়েছে: আমদানি ত্রুটি: 'pdfminer.pdfpage' নামে কোনও মডিউল নেই
জেফরি সোয়ান

4
ধন্যবাদ এটি পাইথন v2.7.12 এবং উবুন্টু 16.04-তে কাজ করে, যদিও পিডিএফ ডকুমেন্টটি এনকোডিং utf-8 দিয়ে লোড করা ভাল হবে কারণ আমার নমুনা পিডিএফটিতে কিছু এনকোডিং সমস্যা রয়েছে তাই utf-8 দিয়ে এনকোডিংয়ের পরে এটি চেষ্টা করুন এবং এটি সমাধান করে ইস্যু ... import sys reload(sys) sys.setdefaultencoding('utf-8')
sib10

4
@ ডাকপুঞ্চার, এটি কি এখন চলছে? আমার file(path, 'rb')কাজ পেতে আমাকে `ওপেন (পথ, 'আরবি') এ পরিবর্তন করতে হয়েছিল।
craned

4
পাইথন ৩..7 ব্যবহারকারীদের জন্য এখনও কাজ করা হচ্ছে। Pdfminer.six == 20181108 প্যাকেজ ইনস্টল করা হয়েছে। আমার মামলার জন্য এখনও অবধি সেরা সমাধান এবং আমি অসংখ্য সমাধানের তুলনা করেছি।
aze45sq6d

30

পাইথন 3 এর জন্য ডাকপঞ্চের কাছ থেকে ভয়ঙ্কর উত্তরটি নিশ্চিত করুন যে আপনি পিডিএফমিনার 2 ইনস্টল করেছেন এবং করছেন:

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

4
এটি আমার পক্ষে কাজ করে না: মডিউল নটফাউন্ড এরিয়ার: 'pdfminer.pdfpage' নামে কোনও মডিউল আমি পাইথনটি ৩.6 ব্যবহার করছি
এট্টি

@ অট্টি, ঠিক এক্ষেত্রে, নিশ্চিত হয়ে নিন যে আপনি পিডিএফমিনার 2 ইনস্টল করেছেন, যেহেতু আরও একটি প্যাকেজ পিডিএফমিনার রয়েছে (আমি এটি ঘৃণা করি)। এটি পিপি 3 ফ্রিজ করার সময় পিডিএফমিনার 2 == 20151206 সংস্করণে কাজ করে।
জুয়ান ইসাজা

4
ধন্যবাদ আমি এটা শেষ পর্যন্ত কাজ আছে, আমি conda ফোর্জ থেকে pdfminer.six ইনস্টল
Atti

8
পাইথন 3 এর জন্য, pdfminer.six প্রস্তাবিত প্যাকেজ - github.com/pdfminer/pdfminer.six
মাইক Driscoll

এটি কি এখনও বর্তমান? আমি একই ImportError:বার্তাটি

14

এটি 2020 সালের মে মাসে পাইথন 3-তে পিডিএফএমাইনার ব্যবহার করে কাজ করে।

প্যাকেজ ইনস্টল করা হচ্ছে

$ 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))

পিপিডিএফ 2 এর সাথে তুলনা করে পারফরম্যান্স এবং নির্ভরযোগ্যতা

পিডিএফএমএন.সিক্স পিডিপিডিএফ 2 (যা নির্দিষ্ট ধরণের পিডিএফগুলির সাথে ব্যর্থ হয়) এর চেয়ে বেশি নির্ভরযোগ্যতার সাথে কাজ করে, বিশেষত পিডিএফ সংস্করণ 1.7 এ

যাইহোক, পিডিএফএমনার.সিক্স সহ পাঠ্য নিষ্কাশন 6 টির একটি ফ্যাক্টর দ্বারা পিপিডিএফ 2 এর তুলনায় উল্লেখযোগ্যভাবে ধীর।

আমি timeitএকটি 15 "এমবিপি (2018) তে পাঠ্য নিষ্কাশন সময়সই করেছি, কেবলমাত্র নিষ্কাশন ফাংশনের সময় নির্ধারণ করেছি (কোনও ফাইল খোলার ইত্যাদি নয়) 10 পৃষ্ঠার পিডিএফ সহ এবং নিম্নলিখিত ফলাফলগুলি পেয়েছি:

PDFminer.six: 2.88 sec
PyPDF2:       0.45 sec

পিডিএফমিনার.সিক্সে একটি বিশাল পায়ের ছাপ রয়েছে, যার জন্য পাইক্রিপ্টোডোম প্রয়োজন হয় যার জন্য জিসিসি এবং অন্যান্য জিনিসগুলি ইনস্টল করা দরকার যা অ্যালপাইন লিনাক্সে ৮০ এমবি থেকে ৩ 350০ এমবি অবধি ন্যূনতম ইনস্টল ডকার ইমেজটি পুশ করে। পাইপডিএফ 2 এর কোনও স্টোরেজ প্রভাব লক্ষ্য করা যায় না।


এই আপডেটটি শেষ আপডেটের পরে ভেঙে যেতে পারে। বর্তমানে ImportError: cannot import name 'open_filename' from 'pdfminer.utils'আমি চালানোর সময় ত্রুটি পেয়েছিfrom pdfminer.high_level import extract_text
আরও পড়ুন

4
আপডেট: আমি একটি নতুন ভেনভ তৈরি করে এবং পিডিএফমিনার.সিক্স পুনরায় ইনস্টল করে এটি ঠিক করেছি। আমি অনুমান করি যে আগে যে অন্য পিডিএফ প্যাকেজগুলির চেষ্টা করেছি সেগুলির মধ্যে হস্তক্ষেপ হচ্ছিল।
আরও পড়া

11

সম্পূর্ণ প্রকাশ, আমি পিডিএফমিনার.সিক্স এর রক্ষণাবেক্ষণকারীদের একজন।

আজকাল, আপনার প্রয়োজনের উপর নির্ভর করে পিডিএফ থেকে পাঠ্য উত্তোলনের জন্য একাধিক এপি রয়েছে। পর্দার আড়ালে, এই সমস্ত এপিআই লেআউটটিকে বিশ্লেষণ এবং বিশ্লেষণের জন্য একই যুক্তি ব্যবহার করে।

(সমস্ত উদাহরণ ধরে নেওয়া আপনার পিডিএফ ফাইলকে উদাহরণ.পিডিএফ বলা হয় )

কমান্ডলাইন

আপনি একবারে পাঠ্য নিষ্কাশন করতে চাইলে আপনি কমান্ডলাইন সরঞ্জামটি ব্যবহার করতে পারেন pdf2txt.py:

$ pdf2txt.py example.pdf

উচ্চ স্তরের এপিআই

আপনি যদি পাইথনের সাহায্যে পাঠ্য উত্তোলন করতে চান তবে আপনি উচ্চ-স্তরের এপিআই ব্যবহার করতে পারেন। আপনি যদি অনেকগুলি পিডিএফ থেকে প্রোগ্রামগতভাবে পাঠ্য নিষ্কাশন করতে চান তবে এই পদ্ধতির কাছে যাওয়া সমাধান।

from pdfminer.high_level import extract_text

text = extract_text('example.pdf')

কম্পোজেবল এপিআই

এছাড়াও একটি কম্পোজেবল এপিআই রয়েছে যা ফলাফল প্রাপ্ত বস্তুগুলি পরিচালনা করতে প্রচুর নমনীয়তা দেয়। উদাহরণস্বরূপ, আপনি এটি ব্যবহার করে আপনার নিজস্ব লেআউট অ্যালগরিদম প্রয়োগ করতে পারেন। এই পদ্ধতিটি অন্য উত্তরে প্রস্তাবিত, তবে আমি কেবল তখনই সুপারিশ করব যখন আপনার পিডিএফমিনার.সিক্স আচরণ করে custom

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

অজগর 3 (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

আমার কাছে পিডিএফ ফাইল রয়েছে যা আমি নাইট্রো প্রো সরঞ্জামটি ব্যবহার করে রূপান্তর করতে সক্ষম। আমি এখানে পোস্ট কোডটি ব্যবহার করে একই পিডিএফ রূপান্তর করার চেষ্টা করি, তবে আমি আউটপুট পাই যা প্রস্তাব দেয় যে এখানে কোনও অনুমতি ত্রুটি রয়েছে। এখানে আউটপুটটি রয়েছে: ('এসইজে সামাজিক বিজ্ঞান সংগ্রহ থেকে All সমস্ত অধিকার সংরক্ষিত \ \ 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 ')
b00kgrrl

ফাইল স্ট্রিম বলতে কী বোঝ?
ভিনসেন্ট

@ ভিনসেন্ট ওপেন (ফাইল, 'আরবি') প্রবাহ হিসাবে: [...]
রডরিগো ফর্মইগেইরি

আপনি কি এই ফাইলটি আদর্শভাবে টেবিল / প্যান্ডাস হিসাবে পেতে চান? groupe-psa.com/en/publication/monthly-world-sales-march-2020
ননো লন্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.