কিভাবে একটি পিডিএফ ফাইল থেকে পাঠ্য নিষ্কাশন?


186

আমি এই পিডিএফ ফাইলটিতে অন্তর্ভুক্ত লেখাটি ব্যবহার করে বের করার চেষ্টা করছি Python

আমি পাইপিডিএফ 2 মডিউলটি ব্যবহার করছি এবং নিম্নলিখিত স্ক্রিপ্টটি রয়েছে:

import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content

আমি কোডটি চালানোর সময়, আমি নিম্নলিখিত আউটপুটটি পাই যা পিডিএফ ডকুমেন্টের অন্তর্ভুক্ত থেকে পৃথক:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

পিডিএফ ডকুমেন্টের মতো আমি কীভাবে টেক্সটটি বের করতে পারি?


9
আমি যে মডিউল ব্যবহার করেছি না, কিন্তু এটি একটি পার্থক্য করতে না যদি আপনি বাইনারি মোডে ফাইল খোলার: pdf_file = open('sample.pdf', 'rb')?
পিএম 2 রিং

2
আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আমি বাইনারি মোড দিয়ে চেষ্টা করেছি, কিন্তু কিছুই পরিবর্তন হয়নি
সরলতা

3
একটি ভাল পিডিএফ ভিউয়ার ব্যবহার করে পাঠ্যটি অনুলিপি করুন - সম্ভব হলে অ্যাডোবের ক্যানোনিকাল অ্যাক্রোব্যাট রিডার। আপনি কি একই ফলাফল পান? পার্থক্যটি এই নয় যে পাঠ্যটি আলাদা, তবে হরফ হ'ল - অন্যান্য মানগুলিতে অক্ষর কোড মানচিত্র। সমস্ত পিডিএফ এ পুনরুদ্ধার করতে সঠিক ডেটা ধারণ করে না।
usr2564301

2
- ওটা পিডিএফ একটি অক্ষর CMap টেবিল ধারন, তাই সীমাবদ্ধতা ও-এরাউন্ড এই থ্রেড আলোচনা করা হয়েছে প্রাসঙ্গিক stackoverflow.com/questions/4203414/...
dwarring

1
পিডিএফটিতে প্রকৃতপক্ষে একটি সঠিক সিএমএএপ রয়েছে তাই এটি অ্যাডহক চরিত্রের ম্যাপিংটিকে সাধারণ পাঠ্যে রূপান্তর করা তুচ্ছ। তবে পাঠ্যের সঠিক ক্রম পুনরুদ্ধার করতে অতিরিক্ত প্রক্রিয়াজাতকরণ লাগে । ম্যাক ওএস এক্সের কোয়ার্টজ পিডিএফ রেন্ডারারের কাজটি খুব খারাপ কাজ! এর মূল রেন্ডারিং অর্ডারে আমি "এম টি'ইউস ইউস আইসন গা টসম ফপল্লোয়েউ ডালফো ডনোগসি উইমাইথ নবম ইআই টিউটোরিয়াল পেয়েছি" ... এক্স কোঅর্ডিনেট অনুসারে বাছাই করার পরে আমি আরও অনেক বেশি সম্ভবত সঠিক ফলাফল পেয়েছি: "এটি একটি নমুনা পিডিএফ ডকুমেন্ট আমি টিউটোরিয়ালটি বরাবর অনুসরণ করতে ব্যবহার করছি।
usr2564301

উত্তর:


197

আমি পাইথন 3.x এবং উইন্ডোগুলির জন্য একটি সাধারণ সমাধান ব্যবহার করার চেষ্টা করছিলাম। টেক্সট্রাক্ট থেকে সমর্থন বলে মনে হচ্ছে না , এটি দুর্ভাগ্যজনক, তবে আপনি উইন্ডোজ / পাইথন 3 এর জন্য টিকা প্যাকেজটি চেকআউট করার জন্য একটি সহজ সমাধান খুঁজছেন, পিডিএফগুলি পড়ার জন্য সরাসরি এগিয়ে forward

টিকা-পাইথন হ'ল পাইথন অ্যাপাচি টিকা ™ আরএসটি পরিষেবাগুলির সাথে আবশ্যক যা পাইথন সম্প্রদায়ের মধ্যে টিকাকে স্থানীয়ভাবে ডাকা যায়।

from tika import parser # pip install tika

raw = parser.from_file('sample.pdf')
print(raw['content'])

নোট করুন যে টিকা জাভাতে লেখা হয়েছে তাই আপনার জাভা রানটাইম ইনস্টল করা দরকার


16
আমি পাইপডিএফ 2, টিকা পরীক্ষা করে দেখেছি এবং টেক্সট্র্যাক এবং পিডিফোটটেক্সট ইনস্টল করতে ব্যর্থ হয়েছি। পাইপডিএফ 2 99 টি শব্দ ফেরত পাঠিয়েছে যখন টিকা আমার পরীক্ষার চালান থেকে 858 টি শব্দ ফিরে পেয়েছিল। তাই টিকা নিয়েই শেষ করলাম।
স্টিয়ান

8
মানুষ আমি তোমাকে ভালবাসি। স্ট্যাকওভারফ্লোতে কেন এত ভাল উত্তর লুকানো আছে তা আমি জানি না। প্রত্যেকে উল্লেখ করে রাখে যে আমাদের পিপিডিএফ 2 বা পিডিফমিনার ব্যবহার করা উচিত তবে তারা দুর্গন্ধযুক্ত। আমি এখন
টিকার

15
আমি একটি "রানটাইময়েরর: টিকা সার্ভার শুরু করতে অক্ষম" ত্রুটি পেয়ে যাচ্ছি।
নভে

3
উত্তর আমি আমার সারাজীবন সন্ধান করে চলেছি, অন্য কেউ কেন টিকার পরামর্শ দেয় না? ধন্যবাদ!
জ্যাকব-জান মোসেলম্যান

4
যদি আপনাকে কোনও ডিরেক্টরিতে সমস্ত পিডিএফ ফাইলগুলিতে এটি চালানোর প্রয়োজন হয় (পুনরাবৃত্তভাবে), এই স্ক্রিপ্টটি নিন
আশা করি

58

টেক্সট্র্যাক ব্যবহার করুন।

এটি পিডিএফ সহ অনেক ধরণের ফাইল সমর্থন করে

import textract
text = textract.process("path/to/file.extension")

24
টেক্সট র্যাপটি একটি দুর্দান্ত মোড়ক বলে মনে হচ্ছে তবে এটি অসংখ্য নন-পাইথন ইউটিলিটিগুলির উপর নির্ভর করে যা কোনও প্রদত্ত সিস্টেমে সহজেই উপলব্ধ নাও হতে পারে।
ডেভিড ব্রাউন

1
পিডিএফ, ইপাবস ইত্যাদির জন্য কাজ করে - এমন পিডিএফ প্রসেস করে যা পিডিএফ মাইনার ব্যর্থ হয়।
উলাদ কাসাচ

এটি কীভাবে লস ল্যাম্বডায় ব্যবহার করবেন, আমি এটি চেষ্টা করে দেখলাম, আমদানি ত্রুটিটি ফ্রি টেক্সট্রাকের ঘটেছে
অরুণ কুমার

5
textractPoppler:pdftotext(অন্যদের মধ্যে) এর জন্য একটি মোড়ক ।
ওয়ানওয়ালিড

1
@ অরুনকুমার: অ্যাডাব্লুএস ল্যাম্বডায় যেটি অন্তর্নির্মিত নয় এমন কোনও কিছু ব্যবহার করার জন্য আপনাকে এটি এবং অন্যান্য অতিরিক্ত নির্ভরতাগুলি আপনার বান্ডলে অন্তর্ভুক্ত করতে হবে।
জেফ লারম্যান

51

এই কোডটি দেখুন:

import PyPDF2
pdf_file = open('sample.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content.encode('utf-8')

আউটপুটটি হ'ল:

!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%

201308FCR.pdf থেকে পিডিএফ পড়তে একই কোডটি ব্যবহার করে .আউটপুটটি স্বাভাবিক।

এর ডকুমেন্টেশন ব্যাখ্যা করে যে:

def extractText(self):
    """
    Locate all text drawing commands, in the order they are provided in the
    content stream, and extract the text.  This works well for some PDF
    files, but poorly for others, depending on the generator used.  This will
    be refined in the future.  Do not rely on the order of text coming out of
    this function, as it will change if this function is made more
    sophisticated.
    :return: a unicode string object.
    """

@ ভিনিশটিপি: আপনি পেজ_সামগ্রীর জন্য কিছু পাচ্ছেন? যদি হ্যাঁ, তবে দেখুন (utf-8) ব্যতীত অন্য কোনও এনকোডিং ব্যবহার করে এটি সহায়তা করে কিনা
কুইন


201308FCR.pdf পাওয়া যায় নি।
চৈতন্য বাপাত

30

টেক্সট্রাক (যা অনেকগুলি নির্ভরশীলতা বলে মনে হয়েছিল) এবং পাইপডিএফ 2 (যা আমি পরীক্ষিত পিডিএফএস থেকে পাঠ্য আহরণ করতে পারিনি) এবং টিকা (যা খুব ধীর ছিল) এর পরে আমি pdftotextএক্সপিডিএফ (ইতিমধ্যে অন্য উত্তরে প্রস্তাবিত হিসাবে ) ব্যবহার করে শেষ করেছি এবং পাইথন থেকে সরাসরি বাইনারি বলা হয়েছে সরাসরি (আপনাকে পিডিফোটোটেক্সটের পথটি খাপ খাইয়ে নিতে হতে পারে):

import os, subprocess
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
args = ["/usr/local/bin/pdftotext",
        '-enc',
        'UTF-8',
        "{}/my-pdf.pdf".format(SCRIPT_DIR),
        '-']
res = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = res.stdout.decode('utf-8')

এখানে পিডিফোটেক্সটেক্সট রয়েছে যা মূলত একই রকম হয় তবে এটি পিএসফোটেক্সটকে / usr / লোকাল / বিনে ধরে রাখে আমি এডাব্লুএস ল্যাম্বডায় এটি ব্যবহার করছি এবং বর্তমান ডিরেক্টরি থেকে এটি ব্যবহার করতে চেয়েছিলাম।

বিটিডব্লিউ: ল্যাম্বডায় এটি ব্যবহারের জন্য আপনাকে বাইনারি এবং নির্ভরতা libstdc++.soআপনার ল্যাম্বডা ফাংশনের মধ্যে রাখতে হবে। আমার ব্যক্তিগতভাবে এক্সপিডিএফ সংকলন করা দরকার। এর জন্য নির্দেশাবলী হিসাবে এই উত্তরটি ফুটিয়ে উঠবে আমি এগুলি আমার ব্যক্তিগত ব্লগে রেখেছি


4
ওরে খোদা, কাজ করে !! শেষ অবধি, এমন একটি সমাধান যা পাঠ্যটিকে সঠিক ক্রমে উত্তোলন করে! আমি এই উত্তরের জন্য আপনাকে আলিঙ্গন করতে চাই! (বা আপনি যদি আলিঙ্গন পছন্দ না করেন তবে এখানে একটি ভার্চুয়াল কফি / বিয়ার / ...)
ডোনকুইকং

4
আনন্দিত এটি সাহায্য! Upvoting আলিঙ্গন হিসাবে একই সংবেদন দেয়, তাই আমি ভাল!
হ্যানসপ্লাস্ট

সহজ ... gr8 বক্স চিন্তা বাইরে!
শান্তনু পাঠক

10

এর পরিবর্তে পাঠ্য নিষ্কাশন করতে আপনি সময় প্রমাণিত এক্সপিডিএফ এবং উত্পন্ন সরঞ্জামগুলি ব্যবহার করতে চাইতে পারেন যেহেতু পাইপিডিএফ 2 এর পাঠ্য নিষ্কাশন নিয়ে এখনও বিভিন্ন সমস্যা রয়েছে বলে মনে হচ্ছে ।

দীর্ঘ উত্তরটি হ'ল পিডিএফ-তে কোনও পাঠ কীভাবে এনকোড করা হয় এবং এর জন্য পিডিএফ স্ট্রিং নিজেই ডিকোড করা দরকার হতে পারে, তারপরে CMAP এর সাথে মানচিত্রের প্রয়োজন হতে পারে, তারপরে শব্দ এবং অক্ষরের মধ্যে দূরত্ব বিশ্লেষণের প্রয়োজন হতে পারে etc.

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


-1 কারণ ওপি পাইথনে পিডিএফ পড়ার জন্য জিজ্ঞাসা করছে এবং পাইথনের জন্য যদিও এখানে এক্সপিডিএফ মোড়ক রয়েছে তবে এটি খুব কম রক্ষণাবেক্ষণ করা হচ্ছে।
সিডুয়েট

9

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

আমি তাদের সাথে তুলনা করার জন্য একটি কোড করেছি: https://github.com/erfelipe/PDFtextExtration আমি আপনাকে সহায়তা করার আশা করি।

টিকা-পাইথন হ'ল পাইথন অ্যাপাচি টিকা ™ আরএসটি পরিষেবাগুলির সাথে আবশ্যক যা পাইথন সম্প্রদায়ের মধ্যে টিকাকে স্থানীয়ভাবে ডাকা যায়।

from tika import parser

raw = parser.from_file("///Users/Documents/Textos/Texto1.pdf")
raw = str(raw)

safe_text = raw.encode('utf-8', errors='ignore')

safe_text = str(safe_text).replace("\n", "").replace("\\", "")
print('--- safe text ---' )
print( safe_text )

3
বিশেষ ধন্যবাদ জন্য.encode('utf-8', errors='ignore')
Evgeny

অ্যাট্রিবিউটআরার: মডিউল 'ওএস'-এর কোনও' অ্যাট্রিবিউট 'নেই
কেরামত

7

নিচের কোড প্রশ্ন করার জন্য একটি সমাধান পাওয়া যাবে পাইথন 3 । কোডটি চালানোর আগে নিশ্চিত হয়ে নিন যে আপনি PyPDF2আপনার পরিবেশে লাইব্রেরিটি ইনস্টল করেছেন । ইনস্টল না করা থাকলে কমান্ড প্রম্পটটি খুলুন এবং নিম্নলিখিত কমান্ডটি চালান:

pip3 install PyPDF2

সমাধান কোড:

import PyPDF2
pdfFileObject = open('sample.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObject)
count = pdfReader.numPages
for i in range(count):
    page = pdfReader.getPage(i)
    print(page.extractText())

2
আপনি কীভাবে সমস্ত বিষয়বস্তু এক টেক্সট ফাইলে সংরক্ষণ করবেন এবং এটি আরও বিশ্লেষণের জন্য ব্যবহার করবেন
রাহুল আগরওয়াল

7
এটি প্রকৃত প্রশ্নে উল্লিখিত সমস্যা সমাধান করে না।
সৌমিক রক্ষিত

7

পিআইপিডিএফ 2 কিছু ক্ষেত্রে শ্বেত স্থানগুলি উপেক্ষা করে ফলাফল পাঠ্যকে জঞ্জাল করে তোলে তবে আমি পাইএমইউপিডিএফ ব্যবহার করি এবং আমি সত্যই সন্তুষ্ট আপনি আরও তথ্যের জন্য এই লিঙ্কটি ব্যবহার করতে পারেন


পাইমুপডিএফ সেরা সমাধান যা আমি পর্যবেক্ষণ করেছি, পিডিফোটটেক্সট বা টিকার মতো জাভা হিসাবে অতিরিক্ত সি ++ লাইব্রেরির প্রয়োজন নেই
কে

জিমিপিডিএফ সত্যিই সর্বোত্তম সমাধান, অতিরিক্ত সার্ভার বা লাইব্রেরি নেই এবং এটি ফাইলের সাথে কাজ করে যেখানে পাইপডিএফ 2 পিআইপিডিএফ 3 পাইপিডিএফ 4 খালি পাঠ্যের স্ট্রিং পুনরুদ্ধার করে। অনেক ধন্যবাদ!
আন্দ্রে বিসেলো

পিমআপডিএফ ইনস্টল করতে, চালান pip install pymupdf==1.16.16। এই নির্দিষ্ট সংস্করণটি ব্যবহার করা হচ্ছে কারণ আজকের নতুন সংস্করণ (17) কাজ করছে না। আমি পাইমআপডিএফ নির্বাচন করেছি কারণ এটি নতুন লাইনের চরে পাঠ্য মোড়ানোর ক্ষেত্রগুলি বের করে \n। সুতরাং আমি পিডিএফ থেকে পাইমুপডিএফ দিয়ে একটি স্ট্রিংয়ে পাঠ্যটি বের করছি এবং তারপরে আমি my_extracted_text.splitlines()পাঠ্যটিকে লাইনগুলিতে বিভক্ত করতে একটি তালিকার জন্য ব্যবহার করছি ।
এরিকফিস

পাইএমইউপিডিএফ সত্যিই অবাক হয়েছিল। ধন্যবাদ।
এরফিলিপ

5

মাল্টি - পেজ পিডিএফ নীচে কোড ব্যবহার করে স্বতন্ত্র পৃষ্ঠা নম্বরটি যুক্তি হিসাবে দেয়ার পরিবর্তে একক প্রবন্ধে পাঠ্য হিসাবে বের করা যেতে পারে

import PyPDF2
import collections
pdf_file = open('samples.pdf', 'rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
c = collections.Counter(range(number_of_pages))
for i in c:
   page = read_pdf.getPage(i)
   page_content = page.extractText()
   print page_content.encode('utf-8')

কেবলমাত্র এখানেই নতুন পৃষ্ঠার সামগ্রীটি সর্বশেষটিকে ওভাররাইট করে
রাহুল আগরওয়াল

5

পিডিফুটটেক্সট সেরা এবং সহজতম! pdftotext এছাড়াও কাঠামো সংরক্ষণ করে।

আমি পাইপিডিএফ 2, পিডিএফ মাইনার এবং আরও কয়েকজন চেষ্টা করেছিলাম কিন্তু তাদের কোনও সন্তোষজনক ফলাফল দেয়নি।


পিডিএফ 2 টেক্সট ইনস্টল করার সময় নিম্নলিখিত বার্তাটি Collecting PDFMiner (from pdf2text), সুতরাং আমি এখন এই উত্তরটি বুঝতে পারি না।
zhy

pdf2text এবং pdftotext আলাদা। উত্তরটি থেকে আপনি লিঙ্কটি ব্যবহার করতে পারেন।
ধরম

ঠিক আছে. এটি কিছুটা বিভ্রান্তিকর।
zhy


3

পাঠ্য উত্তোলনের জন্য এখানে সহজতম কোড

কোড:

# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open('filename.pdf', 'rb')

# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# printing number of pages in pdf file
print(pdfReader.numPages)

# creating a page object
pageObj = pdfReader.getPage(5)

# extracting text from page
print(pageObj.extractText())

# closing the pdf file object
pdfFileObj.close()


2

আমি এখানে পিডিএফ লেআউটটেক্সটস্ট্রিপার একটি সমাধান পেয়েছি found

এটি ভাল কারণ এটি মূল পিডিএফটির লেআউটটি রাখতে পারে ।

এটি জাভাতে লেখা হয়েছে তবে পাইথনকে সমর্থন করার জন্য আমি একটি গেটওয়ে যুক্ত করেছি।

কোডের উদাহরণ:

from py4j.java_gateway import JavaGateway

gw = JavaGateway()
result = gw.entry_point.strip('samples/bus.pdf')

# result is a dict of {
#   'success': 'true' or 'false',
#   'payload': pdf file content if 'success' is 'true'
#   'error': error message if 'success' is 'false'
# }

print result['payload']

পিডিএফ লেআউটটেক্সটস্ট্রাইপার থেকে নমুনা আউটপুট : এখানে চিত্র বর্ণনা লিখুন

পাইথনের সাথে স্ট্রিপার এখানে আপনি আরও বিশদ দেখতে পাচ্ছেন


1

পিডিএফ থেকে পাঠ্য উত্তোলনের জন্য নীচের কোডটি ব্যবহার করুন

import PyPDF2
pdfFileObj = open('mypdf.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

print(pdfReader.numPages)

pageObj = pdfReader.getPage(0)

a = pageObj.extractText()

print(a)

1

আমি ওসিআরের চেয়ে আরও ভাল কাজ পেয়েছি এবং পিডিএফ থেকে পাঠ্য বের করার সময় পৃষ্ঠা প্রান্তিককরণ বজায় রাখতে পারি। সাহায্য করা উচিত:

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

text= convert_pdf_to_txt('test.pdf')
print(text)

0

আমি এটি সম্পাদন করতে কোড যুক্ত করছি: এটি আমার পক্ষে ভাল কাজ করছে:

# This works in python 3
# required python packages
# tabula-py==1.0.0
# PyPDF2==1.26.0
# Pillow==4.0.0
# pdfminer.six==20170720

import os
import shutil
import warnings
from io import StringIO

import requests
import tabula
from PIL import Image
from PyPDF2 import PdfFileWriter, PdfFileReader
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage

warnings.filterwarnings("ignore")


def download_file(url):
    local_filename = url.split('/')[-1]
    local_filename = local_filename.replace("%20", "_")
    r = requests.get(url, stream=True)
    print(r)
    with open(local_filename, 'wb') as f:
        shutil.copyfileobj(r.raw, f)

    return local_filename


class PDFExtractor():
    def __init__(self, url):
        self.url = url

    # Downloading File in local
    def break_pdf(self, filename, start_page=-1, end_page=-1):
        pdf_reader = PdfFileReader(open(filename, "rb"))
        # Reading each pdf one by one
        total_pages = pdf_reader.numPages
        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            output = PdfFileWriter()
            output.addPage(pdf_reader.getPage(i))
            with open(str(i + 1) + "_" + filename, "wb") as outputStream:
                output.write(outputStream)

    def extract_text_algo_1(self, file):
        pdf_reader = PdfFileReader(open(file, 'rb'))
        # creating a page object
        pageObj = pdf_reader.getPage(0)

        # extracting extract_text from page
        text = pageObj.extractText()
        text = text.replace("\n", "").replace("\t", "")
        return text

    def extract_text_algo_2(self, file):
        pdfResourceManager = PDFResourceManager()
        retstr = StringIO()
        la_params = LAParams()
        device = TextConverter(pdfResourceManager, retstr, codec='utf-8', laparams=la_params)
        fp = open(file, 'rb')
        interpreter = PDFPageInterpreter(pdfResourceManager, device)
        password = ""
        max_pages = 0
        caching = True
        page_num = set()

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

        text = retstr.getvalue()
        text = text.replace("\t", "").replace("\n", "")

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

    def extract_text(self, file):
        text1 = self.extract_text_algo_1(file)
        text2 = self.extract_text_algo_2(file)

        if len(text2) > len(str(text1)):
            return text2
        else:
            return text1

    def extarct_table(self, file):

        # Read pdf into DataFrame
        try:
            df = tabula.read_pdf(file, output_format="csv")
        except:
            print("Error Reading Table")
            return

        print("\nPrinting Table Content: \n", df)
        print("\nDone Printing Table Content\n")

    def tiff_header_for_CCITT(self, width, height, img_size, CCITT_group=4):
        tiff_header_struct = '<' + '2s' + 'h' + 'l' + 'h' + 'hhll' * 8 + 'h'
        return struct.pack(tiff_header_struct,
                           b'II',  # Byte order indication: Little indian
                           42,  # Version number (always 42)
                           8,  # Offset to first IFD
                           8,  # Number of tags in IFD
                           256, 4, 1, width,  # ImageWidth, LONG, 1, width
                           257, 4, 1, height,  # ImageLength, LONG, 1, lenght
                           258, 3, 1, 1,  # BitsPerSample, SHORT, 1, 1
                           259, 3, 1, CCITT_group,  # Compression, SHORT, 1, 4 = CCITT Group 4 fax encoding
                           262, 3, 1, 0,  # Threshholding, SHORT, 1, 0 = WhiteIsZero
                           273, 4, 1, struct.calcsize(tiff_header_struct),  # StripOffsets, LONG, 1, len of header
                           278, 4, 1, height,  # RowsPerStrip, LONG, 1, lenght
                           279, 4, 1, img_size,  # StripByteCounts, LONG, 1, size of extract_image
                           0  # last IFD
                           )

    def extract_image(self, filename):
        number = 1
        pdf_reader = PdfFileReader(open(filename, 'rb'))

        for i in range(0, pdf_reader.numPages):

            page = pdf_reader.getPage(i)

            try:
                xObject = page['/Resources']['/XObject'].getObject()
            except:
                print("No XObject Found")
                return

            for obj in xObject:

                try:

                    if xObject[obj]['/Subtype'] == '/Image':
                        size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                        data = xObject[obj]._data
                        if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                            mode = "RGB"
                        else:
                            mode = "P"

                        image_name = filename.split(".")[0] + str(number)

                        print(xObject[obj]['/Filter'])

                        if xObject[obj]['/Filter'] == '/FlateDecode':
                            data = xObject[obj].getData()
                            img = Image.frombytes(mode, size, data)
                            img.save(image_name + "_Flate.png")
                            # save_to_s3(imagename + "_Flate.png")
                            print("Image_Saved")

                            number += 1
                        elif xObject[obj]['/Filter'] == '/DCTDecode':
                            img = open(image_name + "_DCT.jpg", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_DCT.jpg")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/JPXDecode':
                            img = open(image_name + "_JPX.jp2", "wb")
                            img.write(data)
                            # save_to_s3(imagename + "_JPX.jp2")
                            img.close()
                            number += 1
                        elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
                            if xObject[obj]['/DecodeParms']['/K'] == -1:
                                CCITT_group = 4
                            else:
                                CCITT_group = 3
                            width = xObject[obj]['/Width']
                            height = xObject[obj]['/Height']
                            data = xObject[obj]._data  # sorry, getData() does not work for CCITTFaxDecode
                            img_size = len(data)
                            tiff_header = self.tiff_header_for_CCITT(width, height, img_size, CCITT_group)
                            img_name = image_name + '_CCITT.tiff'
                            with open(img_name, 'wb') as img_file:
                                img_file.write(tiff_header + data)

                            # save_to_s3(img_name)
                            number += 1
                except:
                    continue

        return number

    def read_pages(self, start_page=-1, end_page=-1):

        # Downloading file locally
        downloaded_file = download_file(self.url)
        print(downloaded_file)

        # breaking PDF into number of pages in diff pdf files
        self.break_pdf(downloaded_file, start_page, end_page)

        # creating a pdf reader object
        pdf_reader = PdfFileReader(open(downloaded_file, 'rb'))

        # Reading each pdf one by one
        total_pages = pdf_reader.numPages

        if start_page == -1:
            start_page = 0
        elif start_page < 1 or start_page > total_pages:
            return "Start Page Selection Is Wrong"
        else:
            start_page = start_page - 1

        if end_page == -1:
            end_page = total_pages
        elif end_page < 1 or end_page > total_pages - 1:
            return "End Page Selection Is Wrong"
        else:
            end_page = end_page

        for i in range(start_page, end_page):
            # creating a page based filename
            file = str(i + 1) + "_" + downloaded_file

            print("\nStarting to Read Page: ", i + 1, "\n -----------===-------------")

            file_text = self.extract_text(file)
            print(file_text)
            self.extract_image(file)

            self.extarct_table(file)
            os.remove(file)
            print("Stopped Reading Page: ", i + 1, "\n -----------===-------------")

        os.remove(downloaded_file)


# I have tested on these 3 pdf files
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Healthcare-January-2017.pdf"
url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sample_Test.pdf"
# url = "http://s3.amazonaws.com/NLP_Project/Original_Documents/Sazerac_FS_2017_06_30%20Annual.pdf"
# creating the instance of class
pdf_extractor = PDFExtractor(url)

# Getting desired data out
pdf_extractor.read_pages(15, 23)

0

আপনি এর থেকে টিকা-অ্যাপ-xxx.jar (সাম্প্রতিক) ডাউনলোড করতে পারেন এখানে

তারপরে এই .jar ফাইলটি আপনার অজগর স্ক্রিপ্ট ফাইলের একই ফোল্ডারে রাখুন।

তারপরে স্ক্রিপ্টে নিম্নলিখিত কোডটি প্রবেশ করান:

import os
import os.path

tika_dir=os.path.join(os.path.dirname(__file__),'<tika-app-xxx>.jar')

def extract_pdf(source_pdf:str,target_txt:str):
    os.system('java -jar '+tika_dir+' -t {} > {}'.format(source_pdf,target_txt))

এই পদ্ধতির সুবিধা:

কম নির্ভরতা সিঙ্গল .jar ফাইলটি পাইথন প্যাকেজটি পরিচালনা করা সহজ।

মাল্টি-ফর্ম্যাট সমর্থন। অবস্থানটি source_pdfকোনও ধরণের নথির ডিরেক্টরি হতে পারে। (.ডোক, .এইচটিএমএল, .odt, ইত্যাদি)

আপ-টু-ডেট। টিকা-অ্যাপ.জার সর্বদা টিকা পাইথন প্যাকেজের প্রাসঙ্গিক সংস্করণের চেয়ে আগে প্রকাশিত হয়।

স্থিতিশীল। এটি পিআইপিডিএফের চেয়ে অনেক বেশি স্থিতিশীল এবং সু-রক্ষণাবেক্ষণ (অ্যাপাচি দ্বারা চালিত)।

অসুবিধা:

একটি জে-হেডলেস প্রয়োজন।


সম্পূর্ণ পাইথোনিক সমাধান নয়। আপনি যদি এটির প্রস্তাব দেন তবে আপনার একটি অজগর প্যাকেজ তৈরি করা উচিত এবং লোকেদের এটি আমদানি করা উচিত। পাইথনে জাভা কোডের কমান্ড লাইন কার্যকর করার পরামর্শ দিবেন না।
মাইকেল তামিলো

@ মিশেলটাইমিলো, যদি কোনও কোড লিখি যা পাইপিতে আপলোড হতে চলেছে, আমি স্বীকার করি যে এটি কোনও ভাল ধারণা নয়। তবে, অস্থায়ী ব্যবহারের জন্য এটি যদি কেবল অজগর স্ক্রিপ্টটি শেবাং সহ থাকে তবে এটি মন্দ নয়, তাই না?
pah8J

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

0

যদি আপনি এটি উইন্ডোজের অ্যানাকোন্ডায় চেষ্টা করেন তবে পাইপডিএফ 2 অ-মানক কাঠামো বা ইউনিকোড অক্ষর সহ কিছু পিডিএফ হ্যান্ডেল করতে পারে না। নীচের কোডটি ব্যবহার করার পরামর্শ দিচ্ছি যদি আপনার প্রচুর পিডিএফ ফাইলগুলি খোলার এবং পড়ার প্রয়োজন হয় - আপেক্ষিক পথের সাথে ফোল্ডারে থাকা সমস্ত পিডিএফ ফাইলের পাঠ্য .//pdfs//তালিকায় সংরক্ষণ করা হবে pdf_text_list

from tika import parser
import glob

def read_pdf(filename):
    text = parser.from_file(filename)
    return(text)


all_files = glob.glob(".\\pdfs\\*.pdf")
pdf_text_list=[]
for i,file in enumerate(all_files):
    text=read_pdf(file)
    pdf_text_list.append(text['content'])

print(pdf_text_list)

-1

পাইপিডিএফ 2 কাজ করে, তবে ফলাফলগুলি পৃথক হতে পারে। আমি এর ফলাফল নিষ্কাশন থেকে বেশ বেমানান অনুসন্ধান দেখতে পাচ্ছি।

reader=PyPDF2.pdf.PdfFileReader(self._path)
eachPageText=[]
for i in range(0,reader.getNumPages()):
    pageText=reader.getPage(i).extractText()
    print(pageText)
    eachPageText.append(pageText)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.