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

سرور مجازی NVMe

ایجاد یک سند PDF در پایتون با borb

0 2
زمان لازم برای مطالعه: 8 دقیقه


را فرمت سند قابل حمل (PDF) فرمت WYSIWYG (آنچه می بینید همان چیزی است که می گیرید) نیست. این برای پلتفرم-آگنوستیک، مستقل از سیستم عامل اصلی و موتورهای رندر توسعه داده شد.

برای دستیابی به این هدف، PDF ساخته شد تا از طریق چیزی بیشتر شبیه به یک زبان برنامه نویسی و متکی با آن تعامل داشته باشد. روی مجموعه ای از دستورالعمل ها و عملیات برای رسیدن به نتیجه. در واقع PDF است مستقر روی یک زبان برنامه نویسی – پست اسکریپتکه اولین دستگاه مستقل بود زبان توضیحات صفحه.

این دارد اپراتورها که اصلاح می کنند حالت های گرافیکی، که از یک سطح بالا چیزی شبیه به:

  • فونت را روی “Helvetica” تنظیم کنید
  • رنگ استروک را روی مشکی قرار دهید
  • برو به (60700)
  • رسم علامت “H”

این چند مورد را توضیح می دهد:

  • چرا استخراج متن از PDF به روشی واضح بسیار دشوار است
  • چرا ویرایش یک سند PDF دشوار است
  • چرا اکثر کتابخانه‌های PDF یک رویکرد سطح پایین را برای ایجاد محتوا اعمال می‌کنند (شما، برنامه‌نویس باید مختصاتی را که در آن متن، حاشیه‌ها و غیره ارائه می‌شود، مشخص کنید)

در این راهنما، ما استفاده خواهیم کرد بورب – یک کتابخانه پایتون اختصاص داده شده به خواندن، دستکاری و تولید اسناد PDF، برای ایجاد یک سند PDF. هم یک مدل سطح پایین (که به شما امکان می‌دهد به مختصات و طرح‌بندی دقیق در صورت استفاده از آن‌ها دسترسی داشته باشید) و هم یک مدل سطح بالا (که در آن می‌توانید محاسبات دقیق حاشیه‌ها، موقعیت‌ها و غیره را به یک مدیر طرح‌بندی واگذار کنید) ارائه می‌دهد. .

ما نگاهی به روش انجام آن خواهیم داشت یک سند PDF را در پایتون ایجاد و بررسی کنید، با استفاده از borb، و همچنین روش استفاده از برخی از LayoutElements برای اضافه کردن بارکد و جداول

نصب borb

بورب را می توان از منبع دانلود کرد روی GitHub، یا نصب شده از طریق pip:

$ pip install borb

ایجاد یک سند PDF در پایتون با borb

بورب دارای دو کلاس کلیدی بصری – Document و Page، که نشان دهنده یک سند و صفحات درون آن است. اینها هستند چارچوب اصلی برای ایجاد اسناد PDF

علاوه بر این، PDF کلاس یک API را برای بارگیری و ذخیره کردن نشان می دهد Documentما ایجاد می کنیم.

با در نظر گرفتن این موضوع، بیایید یک فایل PDF خالی ایجاد کنیم:

from borb.pdf.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF


document = Document()


page = Page()


document.append_page(page)


with open("output.pdf", "wb") as pdf_file_handle:
    PDF.dumps(pdf_file_handle, document)

بیشتر کدها در اینجا برای خود صحبت می کنند. ما با ایجاد یک خالی شروع می کنیم Document، سپس یک خالی اضافه کنید Page به Document با append() تابع، و در نهایت فایل را از طریق ذخیره کنید PDF.dumps().

شایان ذکر است که ما از آن استفاده کردیم "wb" پرچم برای نوشتن در حالت باینری، از آنجایی که ما نمی خواهیم پایتون این متن را رمزگذاری کند.

این منجر به یک فایل PDF خالی با نام می شود output.pdf روی سیستم پرونده محلی شما:

سند PDF خالی در python

ایجاد سند “Hello World” با borb

البته اسناد PDF خالی واقعاً اطلاعات زیادی را منتقل نمی کنند. بیایید مقداری محتوا به آن اضافه کنیم Page ، قبل از اینکه آن را به آن اضافه کنیم Document نمونه، مثال.

در روشی مشابه به دو کلاس انتگرال از قبل، برای اضافه کردن محتوا به Page، ما اضافه خواهیم کرد PageLayout که نوع طرح‌بندی را مشخص می‌کند که می‌خواهیم ببینیم، و یک یا چند مورد اضافه کنیم Paragraphبه آن طرح

برای این منظور ، Document پایین ترین نمونه در سلسله مراتب اشیا است، در حالی که Paragraph نمونه بالاترین سطح، انباشته است روی بالای PageLayout و در نتیجه ، Page.

بیایید یک را اضافه کنیم Paragraph به ما Page:

from borb.pdf.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF
from borb.pdf.canvas.layout.paragraph import Paragraph
from borb.pdf.canvas.layout.page_layout.multi_column_layout import SingleColumnLayout
from borb.io.read.types import Decimal

document = Document()
page = Page()


layout = SingleColumnLayout(page)


layout.add(Paragraph("Hello World", font_size=Decimal(20), font="Helvetica"))

document.append_page(page)

with open("output.pdf", "wb") as pdf_file_handle:
    PDF.dumps(pdf_file_handle, document)

متوجه خواهید شد که ما 2 شی اضافی اضافه کردیم:

  • یک نمونه از PageLayout، از طریق زیر کلاس خود بتن بیشتری ساخته است SingleColumnLayout: این کلاس مکان هایی که محتوا به a اضافه می شود را پیگیری می کند Page، کدام ناحیه(ها) برای محتوای آینده در دسترس است، چه Page حاشیه ها هستند، و چه چیزی پیشرو (فاصله بین Paragraph اشیاء) قرار است باشد.

از آنجایی که ما در اینجا فقط با یک ستون کار می کنیم، از a استفاده می کنیم SingleColumnLayout. به طور متناوب، می توانیم از آن استفاده کنیم MultiColumnLayout.

  • آ Paragraph مثال: این کلاس یک بلوک از متن را نشان می دهد. می توانید ویژگی هایی مانند فونت، font_size، font_color و بسیاری موارد دیگر را تنظیم کنید. برای مثال های بیشتر، باید مستندات را بررسی کنید.

این یک تولید می کند output.pdf پرونده ای که حاوی ما است Paragraph:

ایجاد یک پی دی اف دنیای سلام با python

بررسی PDF تولید شده با borb

توجه داشته باشید: اگر به کارکرد داخلی یک سند PDF علاقه ندارید، این بخش کاملا اختیاری است.

اما دانستن کمی در مورد قالب می تواند بسیار مفید باشد (مانند زمانی که شما در حال رفع اشکال کلاسیک هستید “چرا محتوای من اکنون نشان داده می شود روی این page” موضوع).

به طور معمول، یک پی دی اف خوان سند را با شروع آخرین بایت می خواند:

xref
0 11
0000000000 00000 f
0000000015 00000 n
0000002169 00000 n
0000000048 00000 n
0000000105 00000 n
0000000258 00000 n
0000000413 00000 n
0000000445 00000 n
0000000475 00000 n
0000000653 00000 n
0000001938 00000 n
trailer
<</Root 1 0 R /Info 2 0 R /Size 11 /ID (<61e6d144af4b84e0e0aa52deab87cfe9><61e6d144af4b84e0e0aa52deab87cfe9>)>>
startxref
2274
%%EOF

در اینجا ما نشانگر انتهای فایل را می بینیم (%%EOF) و جدول ارجاع متقابل (معمولاً به اختصار xref).

را xref توسط نشانه ها مشخص می شود "startxref" و "xref".

یک xref (یک سند می تواند چندگانه داشته باشد) به عنوان یک جدول جستجو برای پی دی اف خوان عمل می کند.

این شامل افست بایت (از بالای فایل) هر شی در یک PDF است. خط اول از xref (0 11) می گوید وجود دارد 11 شی در این xref، و اینکه اولین شی از عدد شروع می شود 0.

هر خط بعدی متشکل از افست بایت و به دنبال آن عدد تولید و حرف است f یا n:

  • اشیاء مشخص شده با f اشیاء آزاد هستند، انتظار نمی رود که ارائه شوند.
  • اشیاء مشخص شده با n “در حال استفاده” هستند.

در پایین xref، ما پیدا می کنیم فرهنگ لغت تریلر. دیکشنری ها، در نحو PDF، توسط << و >>.

این فرهنگ لغت دارای جفت های زیر است:

  • /Root 1 0 R
  • /Info 2 0 R
  • /Size 11
  • /ID (<61e6d144af4b84e0e0aa52deab87cfe9> <61e6d144af4b84e0e0aa52deab87cfe9>)

فرهنگ لغت تریلر نقطه شروع برای پی دی اف خوان است و حاوی ارجاعاتی به تمام داده های دیگر است.

در این مورد:

  • /Root : این فرهنگ لغت دیگری است که به محتوای واقعی سند پیوند دارد.
  • /Info : این فرهنگ لغت حاوی متا اطلاعات سند (نویسنده، عنوان و غیره) است.

رشته هایی مانند 1 0 R در نحو PDF “مرجع” نامیده می شوند. و اینجاست که xref میز به کار می آید

برای یافتن شی مرتبط با 1 0 R ما به شی نگاه می کنیم 1 (شماره نسل 0).

را xref جدول جستجو به ما می گوید که می توانیم انتظار داشته باشیم این شی را در بایت پیدا کنیم 15 از سند

اگر آن را بررسی کنیم، متوجه خواهیم شد:

1 0 obj
<</Pages 3 0 R>>
endobj

توجه کنید که این شیء چگونه با آن شروع می شود 1 0 obj و به پایان می رسد endobj. این تایید دیگری است که ما در واقع با شی سروکار داریم 1.

این فرهنگ لغت به ما می گوید که می توانیم صفحات سند را در شی پیدا کنیم 3:

3 0 obj
<</Count 1 /Kids (4 0 R)
 /Type /Pages>>
endobj

این است /Pages فرهنگ لغت، و به ما می گوید 1 وجود دارد page در این سند ( /Count ورودی). ورودی برای /Kids معمولاً یک آرایه است که در هر یک شی مرجع است page.

ما می توانیم انتظار داشته باشیم که اولین مورد را پیدا کنیم page در شیء 4:

4 0 obj
<</Type /Page /MediaBox (0 0 595 842)
 /Contents 5 0 R /Resources 6 0 R /Parent 3 0 R>>
endobj

این فرهنگ لغت شامل چندین مدخل جالب است:

  • /MediaBox: ابعاد فیزیکی از page (در این مورد اندازه A4 است page).
  • /Contents: اشاره به یک جریان (معمولاً فشرده) از اپراتورهای محتوای PDF.
  • /Resources: ارجاع به فرهنگ لغت حاوی تمام منابع (فونت ها، تصاویر و غیره) مورد استفاده برای رندر کردن page.

بیایید شی را بررسی کنیم 5 برای پیدا کردن آنچه در واقع ارائه شده است روی این page:

5 0 obj
<</Filter /FlateDecode /Length 85>>
stream
xÚãR@
\È<§®ž`a¥£šÔw3T0„É
€!K¡š3B˜„žœenl7'§9©99ù
åùE9)š
!Y(’®!8õÂyšT*î
endstream
endobj

همانطور که قبلا ذکر شد، این جریان (محتوا) فشرده شده است. شما می توانید بگویید که از کدام روش فشرده سازی استفاده شده است /Filter ورود اگر از فشارزدایی استفاده کنیم (unzip) برای شی 5، باید اپراتورهای محتوای واقعی را دریافت کنیم:

5 0 obj
<</Filter /FlateDecode /Length 85>>
stream
            q
            BT
            0.000000 0.000000 0.000000 rg
            /F1 1.000000 Tf            
            20.000000 0 0 20.000000 60.000000 738.000000 Tm            
            (Hello world) Tj
            ET            
            Q
endstream
endobj

در نهایت، ما در سطحی هستیم که می توانیم محتوا را رمزگشایی کنیم. هر خط از آرگومان هایی تشکیل شده است که توسط عملگر آنها دنبال می شود. بیایید سریعاً اپراتورها را مرور کنیم:

  • q: حالت گرافیکی فعلی را حفظ می کند (هل کردن آن به پشته).
  • BT: شروع متن
  • 0 0 0 rg: رنگ ضربه فعلی را روی (0,0,0) rgb. این سیاه است.
  • /F1 1 Tf: فونت فعلی را روی /F1 (این یک ورودی در فرهنگ لغت منابع است که قبلاً ذکر شد) و اندازه قلم به 1.
  • 20.000000 0 0 20.000000 60.000000 738.000000 Tm : ماتریس متن را تنظیم کنید. ماتریس های متنی راهنمای خود را تضمین می کنند. کافی است بگوییم که این ماتریس اندازه فونت و موقعیت متن را تنظیم می کند. در اینجا ما فونت را به مقیاس بزرگ می کنیم font-size 20و مکان نما ترسیم متن را روی آن تنظیم کنید 60,738. سیستم مختصات PDF در پایین سمت چپ a شروع می شود page. بنابراین 60,738 جایی نزدیک بالای سمت چپ است page (با در نظرگرفتن page بود 842 واحد بلند).
  • (Hello world) Tj : رشته ها در نحو پی دی اف با آن محدود می شوند ( و ). این دستور به پی‌دی‌اف‌خوان می‌گوید که رشته «Hello world» را در موقعیتی که قبلاً با ماتریس متن نشان دادیم، با فونت، اندازه و رنگی که در دستورات قبل از آن مشخص کرده‌ایم، ارائه دهد.
  • ET: متن پایانی
  • Q: حالت گرافیکی را از پشته خارج کنید (در نتیجه حالت گرافیک بازیابی می شود).

اضافه کردن سایر borb LayoutElements به صفحات

borb با طیف گسترده ای از LayoutElement اشیاء. در مثال قبلی به طور خلاصه بررسی کردیم Paragraph. اما عناصر دیگری نیز وجود دارد مانند UnorderedList، OrderedList، Image، Shape، Barcode و Table.

بیایید یک مثال کمی چالش برانگیزتر با a ایجاد کنیم Table و Barcode. Tables شامل TableCells که به آن اضافه می کنیم Table نمونه، مثال.

آ Barcode می تواند یکی از بسیاری باشد BarcodeTypes – ما از a استفاده خواهیم کرد QR کد:

from borb.pdf.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF
from borb.pdf.canvas.layout.paragraph import Paragraph
from borb.pdf.canvas.layout.page_layout import SingleColumnLayout
from borb.io.read.types import Decimal
from borb.pdf.canvas.layout.table import Table, TableCell
from borb.pdf.canvas.layout.barcode import Barcode, BarcodeType
from borb.pdf.canvas.color.color import X11Color

document = Document()
page = Page()


layout = SingleColumnLayout(page)


layout.add(Paragraph("DefaultCorp Invoice", font="Helvetica", font_size=Decimal(20)))


layout.add(Barcode(data="0123456789", type=BarcodeType.QR, width=Decimal(64), height=Decimal(64)))


table = Table(number_of_rows=5, number_of_columns=4)


table.add(TableCell(Paragraph("Item", font_color=X11Color("White")), background_color=X11Color("SlateGray")))
table.add(TableCell(Paragraph("Unit Price", font_color=X11Color("White")), background_color=X11Color("SlateGray")))
table.add(TableCell(Paragraph("Amount", font_color=X11Color("White")), background_color=X11Color("SlateGray")))
table.add(TableCell(Paragraph("Price", font_color=X11Color("White")), background_color=X11Color("SlateGray")))

    
for n in (("Lorem", 4.99, 1), ("Ipsum", 9.99, 2), ("Dolor", 1.99, 3), ("Sit", 1.99, 1)):
    table.add(Paragraph(n(0)))
    table.add(Paragraph(str(n(1))))
    table.add(Paragraph(str(n(2))))
    table.add(Paragraph(str(n(1) * n(2))))


table.set_padding_on_all_cells(Decimal(5), Decimal(5), Decimal(5), Decimal(5))
layout.add(table)


document.append_page(page)


with open("output4.pdf", "wb") as pdf_file_handle:
    PDF.dumps(pdf_file_handle, document)

برخی از جزئیات پیاده سازی:

  • borb از مدل های رنگی مختلف پشتیبانی می کند، از جمله: RGBColor، HexColor، X11Color و HSVColor.
  • شما می توانید اضافه کنید LayoutElement اشیاء مستقیماً به a Table شی، اما می‌توانید آنها را با a نیز بپیچید TableCell شی، این گزینه‌های اضافی مانند تنظیمات را در اختیار شما قرار می‌دهد col_span و row_span یا در این مورد، background_color.
  • اگر نه font، font_size یا font_color مشخص شده اند، Paragraph پیش فرض را در نظر می گیرد Helvetica، size 12، black.

این نتیجه در:

ایجاد pdf فاکتور شرکت در python

نتیجه

در این راهنما، نگاهی به آن انداخته ایم بورب، کتابخانه ای برای خواندن، نوشتن و دستکاری فایل های PDF.

ما نگاهی به کلاس های کلیدی مانند Document و Page، و همچنین برخی از عناصر مانند Paragraph، Barcode و PageLayout. در نهایت، ما چند فایل پی‌دی‌اف با محتویات مختلف ایجاد کرده‌ایم، و همچنین روش ذخیره‌سازی داده‌های PDF در زیر کاپوت را بررسی کرده‌ایم.

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



منتشر شده در 1403-01-11 02:37:06

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

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

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