چند وقت بود که میخواستم یک PDF خوان ساده با پایتون داشته باشم که با کتابخانه های pyPDF2 و pytts3 آشنا شدم٬ با اولی میشه کارهای جالبی با پی دی اف کرد و دومی متنی رو تبدیل به صدا می کند.
پس کد زیر رو بعد چندی ارور و دیپندنسی٬ اجرا کردم
# importing the modules import PyPDF2 import pyttsx3 # path, and pages of the PDF file path = 'nodejs.pdf" pdf = open(path, "rb") # 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(":"): first, last = pages.split(":") if not (first.isnumeric() and last.isnumeric()): raise TypeError(f"argument pages must be integer, got {first, last}") 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("there must be one `:` in page argument") 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()
کد کامل رو میتونید از گیت هاب ببینید و اگه دوست داشتین میتونین ستاره✨ بدید یا چنگال🍴 بزنید
تشکر :-)