از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
استفاده از borb با پایتون برای ایجاد کتاب های الکترونیکی از پروژه گوتنبرگ
سرفصلهای مطلب
را فرمت سند قابل حمل (PDF) یک نیست WYSIWYG (آنچه می بینید همان چیزی است که به دست می آورید) قالب این برای پلتفرم-آگنوستیک، مستقل از سیستم عامل اصلی و موتورهای رندر توسعه داده شد.
برای دستیابی به این هدف، PDF ساخته شد تا از طریق چیزی بیشتر شبیه به یک زبان برنامه نویسی و متکی با آن تعامل داشته باشد. روی مجموعه ای از دستورالعمل ها و عملیات برای رسیدن به نتیجه. در واقع PDF است مستقر روی یک زبان برنامه نویسی – پست اسکریپتکه اولین دستگاه مستقل بود زبان توضیحات صفحه.
در این راهنما، ما استفاده خواهیم کرد بورب – یک کتابخانه پایتون که به خواندن، دستکاری و تولید اسناد PDF اختصاص یافته است. هم یک مدل سطح پایین (که به شما امکان میدهد به مختصات و طرحبندی دقیق در صورت استفاده از آنها دسترسی داشته باشید) و هم یک مدل سطح بالا (که در آن میتوانید محاسبات دقیق حاشیهها، موقعیتها و غیره را به یک مدیر طرحبندی واگذار کنید) ارائه میدهد. .
در این راهنما، روش تبدیل کتاب UTF-8 (از پروژه گوتنبرگ) به سند PDF را بررسی خواهیم کرد.
توجه داشته باشید: کتابهای الکترونیکی پروژه گوتنبرگ ممکن است آزادانه در ایالات متحده استفاده شوند زیرا اکثر آنها توسط قانون حق چاپ ایالات متحده محافظت نمیشوند. آنها ممکن است در کشورهای دیگر عاری از حق چاپ نباشند.
نصب borb
بورب را می توان از منبع دانلود کرد روی GitHub، یا نصب شده از طریق pip
:
$ pip install borb
نصب unidecode
برای این پروژه نیز استفاده خواهیم کرد unidecode
، این یک کتابخانه کوچک فوق العاده است که متن را از UTF-8 به ASCII تبدیل می کند. به خاطر داشته باشید که هر کاراکتر در UTF-8 را نمی توان به عنوان یک کاراکتر ASCII نشان داد.
این یک تبدیل ضرری است، در اصل وجود خواهد داشت مقداری هر بار که تبدیل را انجام می دهید، اختلاف وجود دارد:
$ pip install unidecode
ایجاد یک سند PDF با بورب
ایجاد یک سند PDF با استفاده از بورب معمولاً هر بار مراحل یکسانی را دنبال می کند:
from borb.pdf.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF
import typing
import re
from borb.pdf.canvas.layout.page_layout.multi_column_layout import SingleColumnLayout
from borb.pdf.canvas.layout.page_layout.page_layout import PageLayout
pdf = Document()
page = Page()
pdf.append_page(page)
layout: PageLayout = SingleColumnLayout(page)
ایجاد کتاب های الکترونیکی با borb
توجه داشته باشید: ما با کتاب های درسی خام سروکار خواهیم داشت. هر کتاب ساختار متفاوتی خواهد داشت و هر کتاب به رویکرد متفاوتی برای ارائه نیاز دارد. با این حال، این یک کار بسیار ذهنی (طراحی) و بسیار وابسته به کتاب است عمومی process یکسان است.
کتابی که دانلود خواهیم کرد دارای کد UTF-8 است. هر فونتی از هر کاراکتری پشتیبانی نمی کند. در واقع، مشخصات PDF ۱۴ فونت استاندارد را تعریف میکند (که هر خواننده/نویسنده باید آنها را تعبیه کند)، که هیچ یک از محدوده کامل UTF-8 پشتیبانی نمیکنند.
بنابراین، برای اینکه زندگی خود را کمی آسانتر کنیم، از این تابع کاربردی کوچک برای تبدیل a استفاده میکنیم str
به ASCII:
from unidecode import unidecode
def to_ascii(s: str) -> str:
s_out: str = ""
for c in s:
if c == '“' or c == '”' or c == 'â':
s_out += '"'
else:
s_out += unidecode(c)
return s_out
در مرحله بعد، در روش اصلی خود، کتاب UTF-8 را دانلود می کنیم.
در مثال ما از آن استفاده خواهیم کرد “رابطه مرموز در استایلز” توسط آگاتا کریستی، که به راحتی در قالب خام از پروژه گوتنبرگ قابل دریافت است:
url = 'https://www.gutenberg.org/files/863/863-0.txt'
import requests
txt = requests.get(url).text
print("Downloaded %d bytes of text..." % len(txt))
lines_of_text: typing.List(str) = re.split('\r\n', txt)
lines_of_text = (to_ascii(x) for x in lines_of_text)
print("This ebook contains %d lines... " % len(lines_of_text))
این چاپ می کند:
Downloaded 361353 bytes of text...
This ebook contains 8892 lines...
اولین خطوط متن یک هدر کلی است که توسط پروژه گوتنبرگ اضافه شده است. ما واقعاً آن را در کتاب الکترونیکی خود نمیخواهیم، بنابراین با بررسی اینکه آیا یک خط با یک الگوی خاص شروع میشود یا خیر و از طریق نماد برش، آن را به سادگی حذف میکنیم:
header_offset: int = 0
for i in range(0, len(lines_of_text)):
if lines_of_text(i).startswith("*** START OF THE PROJECT GUTENBERG EBOOK"):
header_offset = i + 1
break
while lines_of_text(header_offset).isspace():
header_offset += 1
lines_of_text = lines_of_text(header_offset:)
print("The first %d lines are the gutenberg header..." % header_offset)
این چاپ می کند:
The first 24 lines are the gutenberg header...
به طور مشابه، آخرین خطوط متن فقط یک اعلان حق چاپ است. ما آن را نیز حذف می کنیم:
footer_offset: int = len(lines_of_text)
for i in range(0, len(lines_of_text)):
if "*** END OF THE PROJECT GUTENBERG EBOOK" in lines_of_text(i):
footer_offset = i
break
lines_of_text = lines_of_text(0:footer_offset)
print("The last %d lines are the gutenberg footer .." % (len(lines_of_text) - footer_offset))
با این خارج از راه، ما می رویم process بدنه اصلی متن
این کد مقداری آزمون و خطا طول کشید و اگر با کتاب دیگری کار میکنید – به آزمون و خطا نیز نیاز دارد.
تعیین زمان درج عنوان فصل، زمان شروع یک پاراگراف جدید، فهرست مطالب و غیره بستگی دارد. روی کتاب را نیز. این فرصتی است برای بازی کردن بورب کمی، و سعی کنید ورودی را خودتان با کتاب دیگری تجزیه کنید:
from borb.pdf.canvas.layout.text.paragraph import Paragraph
from borb.pdf.canvas.layout.text.heading import Heading
from borb.pdf.canvas.color.color import HexColor, X11Color
from decimal import Decimal
i: int = 0
while i < len(lines_of_text):
paragraph_text: str = ""
while i < len(lines_of_text) and not len(lines_of_text(i)) == 0:
paragraph_text += lines_of_text(i)
paragraph_text += " "
i += 1
if len(paragraph_text) == 0:
i += 1
continue
if paragraph_text.isspace():
i += 1
continue
if sum((1 for x in paragraph_text.split(' ') if 'CHAPTER' in x)) > 2:
i += 1
continue
print("Processing line %d / %d" % (i, len(lines_of_text)))
if paragraph_text.startswith("CHAPTER"):
print("Adding Header of %d bytes .." % len(paragraph_text))
try:
page = Page()
pdf.append_page(page)
layout = SingleColumnLayout(page)
layout.add(Heading(paragraph_text, font_color=HexColor("13505B"), font_size=Decimal(20)))
except:
pass
continue
try:
layout.add(Paragraph(paragraph_text))
except:
pass
i += 1
تنها چیزی که باقی می ماند این است که سند PDF نهایی را ذخیره کنید:
with open("output.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, pdf)
نتیجه
در این راهنما شما یاد گرفته اید که چگونه process یک قطعه بزرگ از متن و ایجاد یک PDF از آن به طور خودکار با استفاده از بورب.
ایجاد کتاب از فایل های متنی خام یک استاندارد نیست process، و باید چیزها را آزمایش کنید و با حلقه ها و روشی که با متن رفتار می کنید بازی کنید تا درست به دست آورید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-08 03:01:04