از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ایجاد یک سند PDF در پایتون با borb
سرفصلهای مطلب
را فرمت سند قابل حمل (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
روی سیستم پرونده محلی شما:
ایجاد سند “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
:
بررسی 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¡š3Benl7'§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
شامل TableCell
s که به آن اضافه می کنیم Table
نمونه، مثال.
آ Barcode
می تواند یکی از بسیاری باشد BarcodeType
s – ما از 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
اشیاء مستقیماً به aTable
شی، اما میتوانید آنها را با a نیز بپیچیدTableCell
شی، این گزینههای اضافی مانند تنظیمات را در اختیار شما قرار میدهدcol_span
وrow_span
یا در این مورد،background_color
. - اگر نه
font
،font_size
یاfont_color
مشخص شده اند،Paragraph
پیش فرض را در نظر می گیردHelvetica
،size 12
،black
.
این نتیجه در:
نتیجه
در این راهنما، نگاهی به آن انداخته ایم بورب، کتابخانه ای برای خواندن، نوشتن و دستکاری فایل های PDF.
ما نگاهی به کلاس های کلیدی مانند Document
و Page
، و همچنین برخی از عناصر مانند Paragraph
، Barcode
و PageLayout
. در نهایت، ما چند فایل پیدیاف با محتویات مختلف ایجاد کردهایم، و همچنین روش ذخیرهسازی دادههای PDF در زیر کاپوت را بررسی کردهایم.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-11 02:37:06