وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

استفاده از borb با پایتون برای ایجاد کتاب های الکترونیکی از پروژه گوتنبرگ

0 10
زمان لازم برای مطالعه: 4 دقیقه


را فرمت سند قابل حمل (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)

ایجاد کتاب های الکترونیکی پی دی اف با borb

نتیجه

در این راهنما شما یاد گرفته اید که چگونه process یک قطعه بزرگ از متن و ایجاد یک PDF از آن به طور خودکار با استفاده از بورب.

ایجاد کتاب از فایل های متنی خام یک استاندارد نیست process، و باید چیزها را آزمایش کنید و با حلقه ها و روشی که با متن رفتار می کنید بازی کنید تا درست به دست آورید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-08 03:01:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید