abbas80
abbas80
خواندن ۲ دقیقه·۴ ماه پیش

یک پی دی اف خوان جمع و جور با پایتون

چند وقت بود که میخواستم یک PDF خوان ساده با پایتون داشته باشم که با کتابخانه های pyPDF2 و pytts3 آشنا شدم٬ با اولی میشه کارهای جالبی با پی دی اف کرد و دومی متنی رو تبدیل به صدا می کند.

پس کد زیر رو بعد چندی ارور و دیپندنسی٬ اجرا کردم

نسخه صفر

# importing the modules import PyPDF2 import pyttsx3 # path, and pages of the PDF file path = 'nodejs.pdf&quot pdf = open(path, &quotrb&quot) # creating a PdfFileReader object pdfReader = PyPDF2.PdfReader(pdf) # the page with which you want to start # breakpoint() from_page = pdfReader.pages[1] # extracting the text from the PDF text = from_page.extract_text() # reading the text speak = pyttsx3.init() speak.say(text) speak.runAndWait()

بعد با خودم فکر کردم 'چه کاریه فایل و صفحه رو بصورت هارد کد وارد کنیم'؛ پس ورودی های مورد نظر رو از طریق خط فرمان با ماژول os گرفتم: اینجوری

نسخه اول

import os import sys ... path = sys.argv[1] #NOTE: argv[0] is `python[3]` pages = sys.argv[2]

بعد اسکریپتم باید بازه ای از صفحاتو بپذیره ٬تقریبا با فرمت لیست پایتون٬ {هیج جی نشده برنامه مون از ۲۵ خط بیشتر شده٬;) }

... first, last = pages, pages if pages.count(&quot:&quot): first, last = pages.split(&quot:&quot) if not (first.isnumeric() and last.isnumeric()): raise TypeError(f&quotargument pages must be integer, got {first, last}&quot) first, last = int(first), int(last) ... # it's such a mess!

پس چطوره کمی کد رو بهبود بدیم؟



نسخه دوم (فعلا به روز)

بنابراین خواندن ورودی و تبدیل متن به صدا را به دو تابع مجزا انتقال دادم.

def parse_input(path, pages): ranges = pages.split('-') # for indicating range of pages pages= [] for t in ranges: # TODO: regard the case `:n`, `n:` if t == '': # im case -gt `-` continue page=t.split(':') if len(page) == 1:#one page page.append(page[0]) elif len(page) > 2: raise SyntaxError(&quotthere must be one `:` in page argument&quot) pages.append(page) pages = [list(map(int,page)) for page in pages] path = Path(os.getcwd(),path) # full path return path, pages
def pdf_speak(pdfReader, first, last): for page in range(first-1,last): # page adjustment from_page = pdfReader.pages[page] # extracting the text from the PDF text = from_page.extract_text() if text != '': #NOTICE: check to prevent speak error speak.say(text) # reading the text speak.runAndWait()


کد کامل رو میتونید از گیت هاب ببینید و اگه دوست داشتین میتونین ستاره✨ بدید یا چنگال🍴 بزنید
تشکر :-)


گیت هابپی دی افپایتونpdfپی دی اف خوان
شاید از این پست‌ها خوشتان بیاید