কিভাবে কোন পিডিএফ ফাইলের সকল লেখাকে পাইথনে শো করা যায় অর্থাৎ পিডিএফ এর সকল ওয়ার্ডকে পাইথনে এক্সট্রাক্ট করা যায়।

নিম্নের কোডটা ব্যবহার করলেই আপনার কাজ হয়ে যাবে অর্থাৎ পিডিএফ ফাইলকে আপনি পাইথনে শো করাতে পারবেন।

              

আরো সহজে বুঝতে এখনে ক্লিক করুনঃ সহজ উপায়

মেইন টেক্সটঃ

import PyPDF2 from bs4 import BeautifulSoup import requests with open('project.pdf','rb') as pdf_file, open('project.txt', 'w', encoding = 'utf-8') as text_file: read_pdf = PyPDF2.PdfFileReader(pdf_file) number_of_pages = read_pdf.getNumPages() for page_number in range(number_of_pages): # use xrange in Py2 page = read_pdf.getPage(page_number) page_content = page.extractText() text_file.write(page_content) soup = BeautifulSoup(page_content) print(soup)


বোঝার সুবিধার্থে নিচে কোডগুলা ভেঙে ভেঙে ব্যাখ্যা করা হলঃ


import PyPDF2 pdf_file = open('project.pdf','rb') read_pdf = PyPDF2.PdfFileReader(pdf_file) number_of_pages = read_pdf.getNumPages() page = read_pdf.getPage(1) page_content = page.extractText() print (page_content)


১। কোন pdf ফাইলকে পাইথনে দেখাতে বা শো করতে গেলে আমাদেরকে নিচের পদ্ধতিগুলা অনুসরণ করতে হবে-

 ২। প্রথমে আমাদেরকে PyPDF2 নামক একটা লাইব্রেরী ইম্পোর্ট করে নিতে হবে। জুপিটার নোটবুকে কমান্ড প্রম্পে গিয়ে এটা ইনস্টল দিতে হয়। কিভাবে ইনস্টল দিতে হয় সেটা দেখতে এখানে ক্লিক করুন।এর পর সিমপ্লি নিচের কোডগুলা বসালে আপনার কাঙ্খিত pdf ফাইলটি পাইথনে শো করাবে। 

৩। এখানে উল্লেখ থাকে যে, example.pdf এর স্থলে আপনার নির্দিষ্ট ফাইলের নাম দিতে হবে। যেমন যদি আপনার ফাইলের নাম হয় project.pdf তাহলে example.pdf এর স্থলে আমাদেরকে project.pdf বসিয়ে দিতে হবে।

৪। number_of_pages = read_pdf.getNumPages() এই কমান্ডটির মাধ্যমে আমাদের পিডিএফ ফাইলে মোট কয়টি পৃষ্ঠা আছে তা বের করা যায়। যেমন এখন যদি আমরা লিখি print(number_of_pages), তাহলে পাইথন আমাদের দেখিয়ে দেবে ওই পিডিএফ মোট কয়টা পৃষ্ঠা বিদ্যমান।

৫। page = read_pdf.getPage(0) এই কমান্ডটির মাধ্যমে আমরা মোট যতগুলা পৃষ্ঠা আছে তাদের মধ্যে কোন নির্দিষ্ট পৃষ্ঠাকে index করে বের করা যায়। যেমন আমরা যদি লিখি page = read_pdf.getPage(1) তাহলে বোঝাবে যে ওই পিডিএফ ফাইলে যতগুলা পৃষ্ঠা আছে তাদের মধ্যে নাম্বার ইনডেক্স অর্থাৎ নাম্বার পৃষ্ঠা দেখাবে। আর এটা দেখতে হলে আমাদেরকে অবশ্যই পিডিএফ ফাইলকে আগে এক্সট্রাক্ট করে text ফাইলে নিয়ে নিতে হবে। সেটা করার জন্য আমরা page_content = page.extractText() এই কমান্ডের মাধ্যমে এক্সট্রাক্ট করতে হবে।

এখন যদি আমরা


page = read_pdf.getPage(3)
page_content = page.extractText()
print (page_content)    

এই কমান্ডটা লিখি তাইলে পাইথন আমাদেরকে নাম্বার ইনডেক্সিং অর্থাৎ (+) = নাম্বা্র পৃষ্ঠায় যে কন্টেন্ট রয়েছে সেগুলা দেখাবে। কিন্তু সমস্যা হচ্ছে এভাবে বার বার ইন্ডেক্সিং করার মাধ্যমে কোন পেজে কি কন্টেন্ট আছে সেগুলা বার বার চেক করা বেশ কষ্ট সময় সাধ্য। তাই যদি পিডিএফ ফাইলে একাধিক পৃষ্ঠা থাকে এবং আমরা যদি সব গুলা পেজ একসাথে দেখাতে চাই তখন আমরা কি করব? এর জন্য পাইথনে একটা পদ্ধতি রয়েছে যার নাম looping. অর্থাৎ loop চালিয়ে আমরা সহজে কাজটা করে নিতে পারব। এর জন্য নিচের কোডগুলা লিখলেই ব্যস আপনার কাজ শেষ।


import PyPDF2
from bs4 import BeautifulSoup
import requests

with open('project.pdf','rb') as pdf_file, open('project.txt', 'w', encoding = 'utf-8') as text_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    for page_number in range(number_of_pages):   # use xrange in Py2
        page = read_pdf.getPage(page_number)
        page_content = page.extractText()
        text_file.write(page_content)
        print(page_content)

অর্থাৎ এক্ষেত্রে মোট কতগুলা পেজ আছে সেটা দেখার জন্য আমাদেরকে একটা লুপ চালাতে হবে। for লুপের মাধ্যমে আমরা সহজে সবগুলা পেজ একাসাথে দেখতে পারি। কিন্তু এখানে কিছু সমস্যা দেখা দেবে যেগুলা সমাধানের জন্য আমাদেরকে নিচের পদ্ধতি অনুসরণ করতে হবেঃ 

UnicodeEncodeError: 'charmap' codec can't encode character '\ufb01' in position 677: character maps to এই লেখার মাধ্যমে পাইথন আপনাকে একটা ইরোর দিয়ে দিবে।

এর কারণ কি? এর কারণ হচ্ছে ওই ফাইলের মধ্যে এমন কিছু ক্যারেক্টার আছে যেগুলা পাইথন রিড করতে পারছে না। সো সেটা যাতে পাইথন খুব সহজে রিড করতে পারে সে জন্য আমরা একটা কাজ করব। কাজটা হল একটা সার্বজনীন ভাষা কোড ব্যবহার করব। অর্থাৎ encoding = 'utf-8' এই লেখাটা ব্যবহার করব। এটা কেন ব্যবহার করতে হয় সেটা যারা html করেছেন তারা খুব ভাল করেই জানেন বলে আশা করি।

ওকে তাহলে আমাদের কাজ প্রায় শেষ। এখন যদি আমরা এটাকে প্রিন্ট করি তাহলে দেখব আমাদের পিডিএফ এর সবগুলা পেজ পাইথন আমাদেরকে শো করিয়েছে। কিন্তু তবুও একটা ইরোর দেখাতে পারে। আর সেটা হলঃ PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1736] 

সেক্ষেত্রে আবার পূনরায় রান করলে হয়তো আর এই ইরোর দেখাবে না। তার পরও যদি এমন সমস্যা দেখায় তাইলে আমাদেরকে ফাইলটি প্রিটিফাই করে অর্থাৎ 'lxml' (এক ধরণের html ফরমাট) আকারে প্রিন্ট করতে হবে।। সেটা করার জন্য প্রথমে আমাদেরকে প্রিটিফাই লাইব্রেরীটা ইম্পোর্ট দিয়ে নিতে হবে। যেমনঃ from bs4 import BeautifulSoup এখন আমাদেরকে নিচের কমান্ড ব্যবহার করতে হবেঃ


soup = BeautifulSoup(page_content, 'lxml')
print(soup.prettify())
অথবা,
soup = BeautifulSoup(page_content, 'lxml')
print(soup.prettify().encode('cp1252', errors='ignore')) 
import PyPDF2
from bs4 import BeautifulSoup
import requests

with open('project.pdf','rb') as pdf_file, open('project.txt', 'w', encoding = 'utf-8') as text_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    for page_number in range(number_of_pages):   # use xrange in Py2
        page = read_pdf.getPage(page_number)
        page_content = page.extractText()
        text_file.write(page_content)
        soup = BeautifulSoup(page_content, 'lxml')
        print(soup.prettify().encode('cp1252', errors='ignore'))

তবে প্রিটিফাই প্রিন্ট করা ছাড়াও আমরা শুধু ভ্যারিয়েবল (এক্ষেত্রে soup) ধরেও প্রিন্ট করতে পারব। সেক্ষত্রে আমাদেরকে soup = BeautifulSoup(page_content) print(soup) এই কমান্ডটি ব্যবহার করতে হবে।


import PyPDF2
from bs4 import BeautifulSoup
import requests

with open('project.pdf','rb') as pdf_file, open('project.txt', 'w', encoding = 'utf-8') as text_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    for page_number in range(number_of_pages):   # use xrange in Py2
        page = read_pdf.getPage(page_number)
        page_content = page.extractText()
        text_file.write(page_content)
        soup = BeautifulSoup(page_content)
        print(soup)

লুপিং এর কাজ খুব সহজে বুঝতে এইটা দেখুন। একদম সিমপ্লি লুপিং ব্যবহার করে এবং মাত্র কয়েকটা কোড ব্যবহারের মাধ্যমে পুরা পিডিএফ ফাইলকে শো করানো হয়েছেঃ


import PyPDF2
from bs4 import BeautifulSoup
import requests

with open('project.pdf','rb') as pdf_file, open('project.txt', 'w', encoding = 'utf-8') as text_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    for i in range(0,number_of_pages):   # use xrange in Py2 সব পেজ শো করার জন্য লুপ ব্যবহার করা হয়েছে 
        text = read_pdf.getPage(i)
        print(text.extractText())

কিভাবে পিডিএফ ফাইল ওপেন করতে হয় তার একটা বেসিক কমেন্ট এর মাধ্যমে দেখানো হয়েছেঃ


Extracting text from PDF file
# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open('example.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(0)
	
# extracting text from page
print(pageObj.extractText())

# closing the pdf file object
pdfFileObj.close()



Post a Comment

Previous Post Next Post