পিডিএফকে পাঠ্যে রূপান্তর করার জন্য পাইথন মডিউল [বন্ধ]


385

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


1
আমি অনুরূপ সমাধান খুঁজছিলাম। আমি শুধু পিডিএফ ফাইল থেকে পাঠ্য পড়া প্রয়োজন। আমার ছবিগুলির দরকার নেই। pdfminer একটি ভাল পছন্দ তবে আমি কীভাবে টেক্সটটি এক্সট্রাক্ট করতে পারি তার সহজ উদাহরণ খুঁজে পাইনি। অবশেষে আমি এই এসও উত্তর পেয়েছি ( স্ট্যাকওভারফ্লো.com / প্রশ্নস / 7725২২7878/২ ) এবং এখন এটি ব্যবহার করছি।
নয়ন

2
যেহেতু প্রশ্নটি বন্ধ হয়ে গেছে আমি কোনও নতুন উত্তর লিখতে চাইলে সফটওয়্যার সুপারিশগুলিতে উত্সর্গীকৃত স্ট্যাক এক্সচেঞ্জে এটি পোস্ট করেছি:
পিডিএফকে

1
একমাত্র সমাধান যা ইউটিএফ -8 সামগ্রীর জন্য আমার পক্ষে কাজ করেছে: অ্যাপাচি টিকা
শোহম

আমি পাইথন টেক্সট রূপান্তর করতে PDF এর জন্য উপলব্ধ অপশন তালিকা আপডেট চাই, পাইথন জন্য GroupDocs.Conversion ক্লাউড SDK এর নির্ভুলভাবে পাঠ্যে পিডিএফ পরিবর্তন করে।
তিলাল আহমদ

উত্তর:


142

পিডিএফমিনার চেষ্টা করুন । এটি পিডিএফ ফাইল থেকে এইচটিএমএল, এসজিএমএল বা "ট্যাগযুক্ত পিডিএফ" ফর্ম্যাট হিসাবে পাঠ্য বের করতে পারে।

ট্যাগ করা পিডিএফ ফর্ম্যাটটি সবচেয়ে পরিষ্কার বলে মনে হচ্ছে এবং এক্সএমএল ট্যাগগুলি বের করে দেওয়া কেবল খালি পাঠ্যকে ছেড়ে যায়।

পাইথন 3 সংস্করণটি নীচে উপলব্ধ:


2
আমি কেবল একটি লাইব্রেরি হিসাবে পিডিএফমিনিয়ার কীভাবে ব্যবহার করব তা নির্ধারণ করার জন্য একটি উত্তর যুক্ত করেছি।
কোডেপ

24
অজগর 3 সমর্থন নয় :(
কার্ল অ্যাডলার

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

17
অজগর 3 সম্পর্কিত, একটি ছয়-ভিত্তিক কাঁটাচামচ আছে pypi.python.org/pypi/pdfminer.six
ডেনিস কর্নেল


136

কোডপে পোস্ট হওয়ার পরে পিডিএফমিনার প্যাকেজ পরিবর্তন হয়েছে ।

সম্পাদনা (আবার):

সংস্করণে পিডিএফমিনার আবার আপডেট করা হয়েছে 20100213

আপনি নিম্নলিখিতটি সহ যে সংস্করণটি ইনস্টল করেছেন তা পরীক্ষা করতে পারেন:

>>> import pdfminer
>>> pdfminer.__version__
'20100213'

এখানে আপডেট হওয়া সংস্করণটি রয়েছে (আমি কী পরিবর্তন করেছি / যুক্ত করেছি তার মন্তব্যে):

def pdf_to_csv(filename):
    from cStringIO import StringIO  #<-- added so you can copy/paste this to try it
    from pdfminer.converter import LTTextItem, TextConverter
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTTextItem):
                    (_,_,x,y) = child.bbox                   #<-- changed
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)  #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8")  #<-- changed 
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       #<-- changed
    parser.set_document(doc)     #<-- added
    doc.set_parser(parser)       #<-- added
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

সম্পাদনা করুন (এখনও আবার):

এখানে সর্বশেষ সংস্করণ জন্য একটি আপডেট pypi , 20100619p1। সংক্ষেপে আমি প্রতিস্থাপন LTTextItemকরেছি LTCharএবং সিএভিসি কনভার্টর কনস্ট্রাক্টরের কাছে ল্যাপারামগুলির একটি উদাহরণ দিয়েছি।

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter    #<-- changed
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTChar):               #<-- changed
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())  #<-- changed
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

সম্পাদনা (আরও একবার):

সংস্করণটির জন্য আপডেট হয়েছে 20110515(ওউফকো পেন্তানোকে ধন্যবাদ!):

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item._objs:                #<-- changed
                if isinstance(child, LTChar):
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child._text.encode(self.codec) #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

1
[]]: পিডিএফমিনার ইন আমদানি করুন []]: পিডিএফমিনার। LTContainer LTLine LTRect LTTextGroup LITERAL_DEVICE_RGB LTFigure LTPage LTText LTTextLine
Skylar Saveland

@ স্পাইল, উপরের কোডটি পূর্ববর্তী সংস্করণ '20100213' এর জন্য। তাদের ওয়েবসাইটে পরিবর্তনগুলির তালিকা থেকে দেখে মনে হচ্ছে তারা পরিবর্তিত LTTextItemহয়েছে LTCharunixuser.org/~euske/python/pdfminer/index.html#changes
tgray

2
@ ওউফকো পেন্তোনো, ধন্যবাদ! আমি 20110515আপনার মন্তব্য অনুযায়ী সংস্করণ জন্য উত্তরে অন্য বিভাগ যুক্ত করেছি ।
tgray

1
@ ইউজার 3272884 দ্বারা প্রদত্ত উত্তর 5-1-2014 হিসাবে কাজ করে
জুমনশ

1
আমাকে আজ এই একই সমস্যার সমাধান করতে হবে, সাদা স্থান সম্পর্কে তথ্য বের করতে টিগ্রির কোডটি কিছুটা সংশোধন করে এখানে
তারিক্কি

67

যেহেতু এই সমাধানগুলির জন্য কোনওই পিডিএফ মাইনারের সর্বশেষ সংস্করণকে সমর্থন করে না আমি একটি সহজ সমাধান লিখেছি যা পিডিএফ মাইনার ব্যবহার করে কোনও পিডিএফের পাঠ্য ফিরে আসবে। এটি যাঁদের সাথে আমদানি ত্রুটি পাচ্ছেন তাদের পক্ষে কাজ করবেprocess_pdf

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def pdfparser(data):

    fp = file(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print data

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

পাইথন 3 এর জন্য কাজ করে নীচের কোডটি দেখুন:

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
import io

def pdfparser(data):

    fp = open(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print(data)

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

2
এটি আমি খুঁজে পেয়েছি এটি প্রথম স্নিপেট যা বাস্তবে অদ্ভুত পিডিএফ ফাইলগুলির সাথে কাজ করে (বিশেষত ফ্রি ইবুকগুলি প্যাকটপব থেকে পাওয়া যায়)। কোডের অন্যান্য প্রতিটি অংশে কেবল অদ্ভুতভাবে এনকোড করা কাঁচা জিনিস ফিরে আসে তবে আপনার আসলে পাঠ্য আসে। ধন্যবাদ!
somada141

আপনি সম্ভবত তথ্য পাওয়ার পরে retstr.seek (0) করতে চান, বা আপনি সমস্ত পৃষ্ঠা থেকে পাঠ্য সংগ্রহ করবেন।
তিশার্তম্যান

2
সঙ্গে ব্যবহার করার জন্য python3, পরে সুস্পষ্ট প্রথম বন্ধনী ব্যতীত printকমান্ড এক হয়েছে প্রতিস্থাপন fileসঙ্গে কমান্ড openএবং আমদানি StringIOপ্যাকেজ থেকেio
McLawrence

1
কি দারুন. আমি যখন অনুলিপি করেছিলাম তখন এই ব্লকটি পুরোপুরি পুরোপুরি কাজ করেছিল Amaz আশ্চর্য! ডেটা পার্সিং এবং ফিক্সিংয়ের সময় এবং এতে ইনপুট দেওয়ার উপর চাপ না দেওয়া।
SecsAndCyber

1
pdfminer পাইথন 3 এর জন্য কাজ করে না। এই কোডটি pdfminer3k এর জন্য কাজ করে না
থ্যাং করে

47

পিডিফোটটেক্সট একটি ওপেন সোর্স প্রোগ্রাম (এক্সপিডিএফ এর অংশ) যা আপনি পাইথন থেকে কল করতে পারেন (আপনি যা চেয়েছিলেন তা নয় তবে কার্যকর হতে পারে)। আমি এটি কোনও সমস্যা ছাড়াই ব্যবহার করেছি। আমার মনে হয় গুগল এটি গুগল ডেস্কটপে ব্যবহার করে।


6
এটি এখানে তালিকাভুক্ত সরঞ্জামগুলির মধ্যে সবচেয়ে দরকারী বলে মনে হয়, পিডিএফে থাকা -layoutপাঠ্যকে একই অবস্থানে রাখার বিকল্প সহ । এখন যদি আমি বুঝতে পারি যে এটিতে কীভাবে পিডিএফের বিষয়বস্তুগুলি পাইপ করা যায়।
ম্যাথু শিনকেল

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

অবশ্যই, স্টাডআউটে আউটপুট পুনর্নির্দেশের জন্য ফাইলের নাম হিসাবে '-' ব্যবহার করুন। এইভাবে আপনি সাধারণ সাবপ্রসেস.সিচ_আউটপুট ব্যবহার করতে পারেন এবং এই কলটি অভ্যন্তরীণ ফাংশনের মতো মনে হবে।
Ctrl-C

যে কেউ এটি ব্যবহার করছে তাকে পুনরায় প্রয়োগ করতে। । । pdftotextখুব ভাল কাজ করছে বলে মনে হচ্ছে, তবে এটি স্টিডআউটের ফলাফলগুলি দেখতে চাইলে এটির একটি দ্বিতীয় যুক্তি যা হাইফেন needs
গর্ডন লিনফ

1
এটি বর্তমান ফোল্ডার থেকে শুরু করে সমস্ত পিডিএফ ফাইলকে পুনরাবৃত্তিতে রূপান্তরিত করবে: find . -iname "*.pdf" -exec pdftotext -enc UTF-8 -eol unix -raw {} \;ডিফল্টরূপে উত্পন্ন ফাইলগুলি .txtএক্সটেনশনের সাথে আসল নাম নেয় ।
সিসিপিজ্জা

43

পিপিপিএফ সূক্ষ্মভাবে কাজ করে (ধরে নিবেন যে আপনি সু-গঠিত পিডিএফ নিয়ে কাজ করছেন)। যদি আপনি যা চান তা হ'ল পাঠ্য (স্পেস সহ), আপনি কেবল এটি করতে পারেন:

import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
    print page.extractText()

আপনি মেটাডেটা, চিত্র ডেটা, এবং আরও সহজেই অ্যাক্সেস পেতে পারেন।

এক্সট্রাক্টেক্সট কোড নোটগুলিতে একটি মন্তব্য:

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

সমস্যাটি কিনা তা আপনি পাঠ্যের সাহায্যে কী করছেন তার উপর নির্ভর করে (উদাঃ যদি অর্ডারটির কোনও ব্যাপার না হয় তবে তা ঠিক আছে, বা জেনারেটর প্রবাহে পাঠ্য যুক্ত করলে এটি প্রদর্শিত হবে, ঠিক আছে) । আমার প্রতিদিনের ব্যবহারে পাইপডিএফ এক্সট্রাকশন কোড রয়েছে, কোনও সমস্যা নেই।


7
কোনও ইউনিকোড সমর্থন নেই :(
PanosJee

7
পিপিডিএফ এখন ইউটিএফ সমর্থন করে।
lbolla

2
এই গ্রন্থাগারটি আবর্জনার মতো দেখাচ্ছে। এলোমেলো পিডিএফ পরীক্ষা করা আমাকে ত্রুটি দেয় "পাইপডিএফ.টিটিলস.পিডিএফআরইডেরর: ইওএফ চিহ্নিতকারী পাওয়া যায় নি"
সেরিন

4
প্রশ্ন থেকে: উত্পন্ন পাঠ্যের কোনও স্থান নেই এবং এর কোনও ব্যবহার ছিল না । আমি পাইপিডিএফ ব্যবহার করেছি এবং একই ফলাফল পেয়েছি - শব্দের মধ্যে কোনও ফাঁক ছাড়াই পাঠ্য নিষ্কাশন করা হয়।
জর্ডান রিটার

আমি যখন পেজ.অ্যাক্সট্রাক্ট টেক্সট () ফাংশনটি সম্পাদন করি তখন আমি ত্রুটিটি পেয়েছি 'TypeError:' বাইটস 'অবজেক্টকে স্পষ্টভাবে রূপান্তর করতে পারি না' আমি কীভাবে এর সাথে ডিল করতে পারি?
জুঙ্কিস্মিথ

21

আপনি খুব সহজেই একটি লাইব্রেরি হিসাবে পিডিএফমিনার ব্যবহার করতে পারেন। আপনি পিডিএফ এর সামগ্রী মডেল অ্যাক্সেস করতে পারেন এবং আপনার নিজের পাঠ্য নিষ্কাশন তৈরি করতে পারেন। নীচের কোডটি ব্যবহার করে আমি পিডিএফ সামগ্রীগুলি আধা-কোলন দ্বারা পৃথক করা পাঠ্যে রূপান্তর করতে করেছি did

ফাংশনটি কেবল তাদের y এবং x স্থানাঙ্ক অনুযায়ী টেক্সট আইটেম সামগ্রীকে বাছাই করে এবং একই y এর আইটেমগুলিকে একই পাঠ্য রেখার মতো স্থিত করে আউটপুট দেয়, এবং একই লাইনে অবজেক্টগুলিকে আলাদা করে দেয়; '; চরিত্র.

এই পদ্ধতির ব্যবহার করে, আমি কোনও পিডিএফ থেকে পাঠ্যটি বের করতে সক্ষম হয়েছি যে অন্য কোনও সরঞ্জাম এখান থেকে আরও পার্সিংয়ের জন্য উপযুক্ত সামগ্রী বের করতে সক্ষম ছিল না। অন্যান্য সরঞ্জামগুলির মধ্যে আমি চেষ্টা করেছি পিডিফোটটেক্সট, পিএস 2 এসসিআই এবং অনলাইন সরঞ্জাম pdftextonline.com।

পিডিএফমিনার পিডিএফ-স্ক্র্যাপিংয়ের জন্য একটি অমূল্য সরঞ্জাম।


def pdf_to_csv(filename):
    from pdflib.page import TextItem, TextConverter
    from pdflib.pdfparser import PDFDocument, PDFParser
    from pdflib.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, TextItem):
                    (_,_,x,y) = child.bbox
                    line = lines[int(-y)]
                    line[x] = child.text

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, "ascii")

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(doc, fp)
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

আপডেট :

উপরের কোডটি API এর একটি পুরানো সংস্করণের বিরুদ্ধে লেখা হয়েছে, নীচে আমার মন্তব্য দেখুন।


সাথীর কাজের জন্য আপনার কোন ধরণের প্লাগইন দরকার? আমি pdfminer ডাউনলোড এবং ইনস্টল করেছি তবে এটি যথেষ্ট নয় ...
kxk

1
উপরের কোডটি পিডিএফএমনারের একটি পুরানো সংস্করণের বিপরীতে লেখা হয়েছে। এপিআই আরও সাম্প্রতিক সংস্করণে পরিবর্তিত হয়েছে (উদাহরণস্বরূপ, প্যাকেজটি এখন pdfminer, নেই pdflib)। আমি আপনাকে pdf2txt.pyপিডিএফএমনির উত্সের উত্সটি দেখে পরামর্শ দিই, উপরের কোডটি সেই ফাইলটির পুরানো সংস্করণ দ্বারা অনুপ্রাণিত হয়েছিল।
কোডেপ

17

slate এটি এমন একটি প্রকল্প যা একটি লাইব্রেরি থেকে পিডিএফমিনার ব্যবহার করা খুব সহজ করে তোলে:

>>> with open('example.pdf') as f:
...    doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'   

1
"আমদানি স্লেট" চালানোর সময় আমি একটি আমদানি ত্রুটি পাচ্ছি: {ফাইল "সি: \ পাইথোন 33 \ lib \ সাইট-প্যাকেজগুলি \ স্লেট-0.3-py3.3.egg \ স্লেট_ init_ .py ", লাইন 48, < মডুললে > আমদানি ত্রুটি: পিডিএফ নাম আমদানি করতে পারে না} তবে পিডিএফ বর্গ রয়েছে! আপনি কীভাবে এটি সমাধান করবেন জানেন?
জুয়ানকিমিথ

না, এটা খুব অদ্ভুত লাগে। আপনার কি নির্ভরতা আছে?
টিম ম্যাকনামারা

সাধারণত আমি মিস করা নির্ভরতা সম্পর্কে বার্তা পাই, এই ক্ষেত্রে আমি ক্লাসিক বার্তাটি "স্লেট ফাইল ইম্পোর্ট করুন" সি: \ পাইথন 33 33 lib \ সাইট-প্যাকেজস \ স্লেট-0.3-py3.3.egg \ স্লেট_ init_ .py ", লাইন 48 পেয়েছি << মডিউল> আমদানি ত্রুটিতে: পিডিএফ নাম আমদানি করতে পারে না "
জুয়ানকিমিথ


6
এই প্যাকেজটি আর রক্ষণাবেক্ষণ করা হয় না। এটি ব্যবহার থেকে বিরত থাকুন। আপনি এটি পাইথন 3.5
তেও

9

পাইথন মডিউলের মধ্যে একটি নির্দিষ্ট পিডিএফকে সরল পাঠ্যে রূপান্তর করা দরকার to আমি পিডিএফমিনার 20110515 ব্যবহার করেছি , তাদের পিডিএফ 2 টেক্সট.পি সরঞ্জাম দিয়ে পড়ার পরে আমি এই সাধারণ স্নিপেটটি লিখেছিলাম:

from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

def to_txt(pdf_path):
    input_ = file(pdf_path, 'rb')
    output = StringIO()

    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    process_pdf(manager, converter, input_)

    return output.getvalue() 

1
ডিএফ টু টেক্সট (পিডিএফ_পাথ):
কেটলিন জর্জ ফেটিলি

আমি যদি কেবলমাত্র একটি নির্দিষ্ট সংখ্যক পৃষ্ঠাগুলিকে রূপান্তর করতে চাই, তবে আমি কীভাবে এই কোডটি দিয়ে এটি করব?
psychok7

@ psychok7 আপনি কি পিডিএফ 2 টেক্সট সরঞ্জামটি ব্যবহার করার চেষ্টা করেছেন? এটি বর্তমান সংস্করণে -p পতাকার সাহায্যে সমর্থন করে বলে মনে হয়, বাস্তবায়ন অনুসরণ করা সহজ বলে মনে হয় এবং এটিও কাস্টমাইজ করা সহজ হওয়া উচিত: github.com/euske/pdfminer/blob/master/tools/pdf2txt.py আশা করি এটি সাহায্য করবে! :)
গনজ

1
থ্যাঙ্কস @ অ্যাগোনজ, আমি উপরের সমস্তটির জন্য চেষ্টা করেছি তবে আপনার সমাধানটি আমার পক্ষে নিখুঁত হতে পারে, স্পেস সহ আউটপুট :)
ল্যাজারাস

pdf2txt.py আমার জন্য এখানে ইনস্টল করা আছে:C:\Python27\Scripts\pdfminer\tools\pdf2txt.py
লাল মটর

6

পিডিএফ 2 টেক্সট.পি কোড যা পিডিএফমিনারের সাথে আসে তা পুনরায় পোস্ট করা; আপনি এমন একটি ফাংশন তৈরি করতে পারেন যা পিডিএফের দিকে এগিয়ে যাবে; allyচ্ছিকভাবে, একটি আউটটাইপ (txt | html | xML | ট্যাগ) এবং pdf2txt কমান্ডলাইন {'-o': '/path/to/outfile.txt' ...} এর মতো পছন্দ রয়েছে} ডিফল্টরূপে, আপনি কল করতে পারেন:

convert_pdf(path)

একটি পাঠ্য ফাইল তৈরি করা হবে, মূল সিস্টেমে পিডিএফ থেকে ফাইল সিস্টেমে একটি ভাইবাল।

def convert_pdf(path, outtype='txt', opts={}):
    import sys
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
    from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, TagExtractor
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfdevice import PDFDevice
    from pdfminer.cmapdb import CMapDB

    outfile = path[:-3] + outtype
    outdir = '/'.join(path.split('/')[:-1])

    debug = 0
    # input option
    password = ''
    pagenos = set()
    maxpages = 0
    # output option
    codec = 'utf-8'
    pageno = 1
    scale = 1
    showpageno = True
    laparams = LAParams()
    for (k, v) in opts:
        if k == '-d': debug += 1
        elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
        elif k == '-m': maxpages = int(v)
        elif k == '-P': password = v
        elif k == '-o': outfile = v
        elif k == '-n': laparams = None
        elif k == '-A': laparams.all_texts = True
        elif k == '-D': laparams.writing_mode = v
        elif k == '-M': laparams.char_margin = float(v)
        elif k == '-L': laparams.line_margin = float(v)
        elif k == '-W': laparams.word_margin = float(v)
        elif k == '-O': outdir = v
        elif k == '-t': outtype = v
        elif k == '-c': codec = v
        elif k == '-s': scale = float(v)
    #
    CMapDB.debug = debug
    PDFResourceManager.debug = debug
    PDFDocument.debug = debug
    PDFParser.debug = debug
    PDFPageInterpreter.debug = debug
    PDFDevice.debug = debug
    #
    rsrcmgr = PDFResourceManager()
    if not outtype:
        outtype = 'txt'
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'
            elif outfile.endswith('.xml'):
                outtype = 'xml'
            elif outfile.endswith('.tag'):
                outtype = 'tag'
    if outfile:
        outfp = file(outfile, 'w')
    else:
        outfp = sys.stdout
    if outtype == 'txt':
        device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
    elif outtype == 'xml':
        device = XMLConverter(rsrcmgr, outfp, codec=codec, laparams=laparams, outdir=outdir)
    elif outtype == 'html':
        device = HTMLConverter(rsrcmgr, outfp, codec=codec, scale=scale, laparams=laparams, outdir=outdir)
    elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp, codec=codec)
    else:
        return usage()

    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password)
    fp.close()
    device.close()

    outfp.close()
    return

1

পিডিএফএমনার আমাকে পিডিএফ ফাইলের প্রতিটি পৃষ্ঠায় সম্ভবত একটি লাইন [7 পৃষ্ঠার 1 ...] দিয়েছিল আমি এটি দিয়ে চেষ্টা করেছি।

আমার এখনও অবধি সবচেয়ে ভাল উত্তরটি হল পিডিএফটাইপ, বা এটি সিপিডিএফ ভিত্তিক সি ++ কোড।

পিডিএফটাইপের আউটপুট কেমন লাগে তার জন্য আমার প্রশ্নটি দেখুন ।



1

আমি যুক্তিটি pdftohtmlদিয়ে ব্যবহার করেছি, এর সাথে -xmlফলাফলটি পড়ি subprocess.Popen(), এটি আপনাকে পিডিএফ এর প্রতিটি টুকরো টুকরো এক্স কোর্ড, ওয়াই কর্ড, প্রস্থ, উচ্চতা এবং ফন্ট দেবে । আমি মনে করি এটিই 'প্রমাণিত' সম্ভবত খুব বেশি ব্যবহার করে কারণ একই ত্রুটি বার্তাগুলি বানান।

আপনার যদি কলামার ডেটা প্রক্রিয়াকরণের দরকার হয় তবে এটি আপনার পিডিএফ ফাইলের জন্য উপযুক্ত একটি অ্যালগরিদম আবিষ্কার করতে হবে বলে এটি কিছুটা জটিল হয়ে যায়। সমস্যাটি হ'ল যে প্রোগ্রামগুলি পিডিএফ ফাইল তৈরি করে সেগুলি অবশ্যই কোনও যৌক্তিক বিন্যাসে পাঠ্য আউট দেয় না। আপনি সরল অ্যালগরিদমগুলি চেষ্টা করে দেখতে পারেন এবং এটি কখনও কখনও কাজ করে তবে সেখানে 'স্ট্রেগলার্স' এবং 'স্ট্রেস', টেক্সটের কিছু অংশ থাকতে পারে যা আপনি ভেবেছিলেন যে ক্রমটি সেগুলি করে না। সুতরাং আপনি সৃজনশীল পেতে হবে।

আমি যে পিডিএফটিতে কাজ করছি তার জন্য একটি নির্ধারণ করতে আমার প্রায় 5 ঘন্টা সময় লেগেছে। তবে এটি এখন বেশ ভাল কাজ করে। শুভকামনা।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.