از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تولید فایل های PDF در Node.js با PDFKit فرمت PDF یکی از رایج ترین فرمت های سند برای انتقال اطلاعات است. در برنامه های وب پویا، ممکن است نیاز داشته باشید export داده ها در یک سند و PDF معمولا یک گزینه محبوب است. در این مقاله به روش تولید فایل های PDF در NodeJS با استفاده از NPM می پردازیم.
سرفصلهای مطلب
معرفی
فرمت PDF یکی از رایج ترین فرمت های اسناد برای انتقال اطلاعات است. در برنامه های وب پویا، ممکن است نیاز داشته باشید export داده ها در یک سند و PDF معمولا یک گزینه محبوب است. در این مقاله به روش تولید فایل های PDF در NodeJS با استفاده از بسته NPM می پردازیم pdfkit
.
PDFKit یک کتابخانه تولید PDF جاوا اسکریپت برای Node.js است که راهی آسان برای ایجاد چندpage، اسناد PDF قابل چاپ.
شروع کار با PDFKit
بیایید یک فهرست پروژه ایجاد کنیم، cd
وارد آن شده و پروژه Node را با تنظیمات پیش فرض مقداردهی اولیه کنید:
$ mkdir pdfkit-project
$ cd pdfkit-project
$ npm init -y
سپس، اجازه دهید install pdfkit
:
$ npm install pdfkit
برای استفاده از ماژول در پروژه، ما import آن از طریق require()
:
const PDFDocument = require('pdfkit');
ایجاد یک سند PDF با استفاده از PDFKit
برای ایجاد یک سند PDF، ما نیاز داریم import را fs
ماژول (سیستم فایل) نیز. خوب لوله محتویات فایل PDF ما را در یک fs
جریان قابل نوشتن برای ذخیره آن. بیایید نگاهی به روش انجام این کار بیندازیم:
const PDFDocument = require('pdfkit');
const fs = require('fs');
let pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('SampleDocument.pdf'));
pdfDoc.text("My Sample PDF Document");
pdfDoc.end();
اول ما import ماژول های مورد نیاز، پس از آن، ما نمونه سازی می کنیم PDFDocument
. این نمونه یک جریان قابل خواندن است. ما آن جریان را به یک جریان قابل نوشتن برای ذخیره فایل وارد می کنیم.
اگر با روش کار استریم ها آشنا نیستید، مقدمه Node.js Streams را بررسی کنید.
ما از pipe()
تابع برای انجام این کار و ذخیره نتیجه SampleDocument.pdf
به ما root فهرست راهنما. پس از ایجاد، میتوانیم محتوا را به آن اضافه کنیم text
تابع. البته، ما می خواهیم end()
جریان در پایان
وقتی کد را اجرا می کنیم، یک فایل پی دی اف فراخوانی می شود SampleDocument.pdf
در ایجاد می شود root پوشه پروژه ما:
$ node index.js
توجه داشته باشید: قبل از تلاش برای بازنویسی یک فایل PDF موجود، باید رایگان باشد. یعنی – تمام پنجره های دارای آن فایل PDF باید بسته شوند وگرنه برنامه خطا می دهد.
قالب بندی متن در فایل PDF
البته، pdfkit
به ما این امکان را می دهد که کارهای بیشتری از اضافه کردن متن بدون قالب به یک سند انجام دهیم. بیایید به برخی از ویژگی هایی که ارائه می دهد نگاهی بیندازیم.
متن موقعیت یابی
به طور پیش فرض، pdfkit
ماژول اساساً جایی که متن باید به سند اضافه شود را پیگیری می کند print هر تماس به text()
عملکرد در یک خط جدید
می توانید محل چاپ متن را در جریان فعلی تغییر دهید page، با اضافه کردن ایکس و y مختصات مکانی که می خواهید متن به عنوان آرگومان در آن قرار گیرد text()
تابع.
مثلا:
pdfDoc.text("Text positioned at (200,200)", 200, 200);
این مفید است زیرا به شما امکان می دهد موقعیت متن را به دقت تنظیم کنید، به خصوص از آنجایی که اسناد PDF بدون در نظر گرفتن دستگاه / سیستم عاملی که باز می شوند، ظاهری جهانی دارند. روی. این همچنین به شما این امکان را می دهد که برای مثال، print متن روی متن دیگر:
const PDFDocument = require('pdfkit');
const fs = require('fs');
var pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('SampleDocument.pdf'));
pdfDoc.text("From Mon-Sat we will have a 10% discount روی selected items!", 150, 150);
pdfDoc
.fillColor('red')
.fontSize(17)
.text("20%", 305, 150);
pdfDoc.end();
اجرای این کد به ما می دهد:
بسته بندی و تراز کردن متن
این pdfkit
ماژول بهطور خودکار خطوط را میپیچد تا بین حاشیهها یا در آن قرار بگیرند width
ارائه شده (هنگام نوشتن متن در ستون). به عبارت دیگر، lineBreak
گزینه است true
به صورت پیش فرض. می توانید آن را تغییر دهید false
هنگام تماس با text()
تابع:
pdfDoc.text("very long text ".repeat(20), { lineBreak : false });
صفحات جدید نیز در صورت نیاز به صورت خودکار اضافه می شوند، یعنی به محض اینکه محتوایی که می خواهید اضافه کنید جا نیفتد روی جاری page به طور کامل. با این حال، شما همچنین می توانید به بعدی تغییر دهید page قبل از پر کردن شماره قبلی با تماس ساده:
pdfDoc.addPage();
در مورد هم ترازی، pdfkit
گزینه های معمول را در اختیار ما قرار می دهد – left
(پیش فرض)، right
، center
و justify
. توجه داشته باشید که تنظیم یک تراز خاص با lineBreak
تنظیم کنید false
کار نخواهد کرد، حتی اگر متن در یک خط قرار گیرد.
فقط به عنوان lineBreak
، align
پارامتر با ارسال یک شی حاوی جفت های کلید-مقدار به آن تنظیم می شود text()
تابع. بیایید به چند نمونه تراز نگاه کنیم:
const PDFDocument = require('pdfkit');
const fs = require('fs');
var pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('text_alignment.pdf'));
pdfDoc.text("This text is left aligned", { align: 'left'})
pdfDoc.text("This text is at the center", { align: 'center'})
pdfDoc.text("This text is right aligned", { align: 'right'})
pdfDoc.text("This text needs to be slightly longer so that we can see that justification actually works as intended", { align: 'justify'})
pdfDoc.end();
با اجرای کد بالا یک پی دی اف به شکل زیر به ما می دهد:
استایل دادن به متن
این pdfkit
ماژول همچنین گزینه هایی را ارائه می دهد که می توان از آنها برای استایل دادن به متن در اسناد PDF خود استفاده کرد. ما نگاهی به برخی از مهمترین گزینههای استایل میاندازیم، میتوانید فهرست کامل گزینهها را در آن بیابید راهنمای PDF.
میتوانیم گزینههای مختلفی را بهعنوان جفت کلید-مقدار به آن ارسال کنیم text()
تابع، و همچنین چندین توابع دیگر را قبل از فراخوانی زنجیر کنید text()
اصلا
نکته بسیار مهمی که باید به آن توجه کرد این است که توابع زنجیره ای مانند fillColor()
(و بعد font()
، fontSize()
و غیره) تاثیر خواهد گذاشت همه متن بعد از آن تماس:
const PDFDocument = require('pdfkit');
const fs = require('fs');
var pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('text_styling.pdf'));
pdfDoc
.fillColor('blue')
.text("This is a link", { link: 'https://pdfkit.org/docs/guide.pdf', underline: true });
pdfDoc
.fillColor('black')
.text("This text is underlined", { underline: true });
pdfDoc.text("This text is italicized", { oblique: true });
pdfDoc.text("This text is striked-through", { strike: true });
pdfDoc.end();
با اجرای این کد یک فایل PDF با محتویات زیر تولید می شود:
تغییر سبک ها در وسط یک پاراگراف کمی پیچیده تر است، زیرا زنجیره ای چندگانه است text()
توابع به صورت پیش فرض یک خط جدید بعد از هر کدام اضافه می کند. ما می توانیم با تنظیم از این جلوگیری کنیم lineBreak
گزینه اول text()
تماس گرفتن false
:
const PDFDocument = require('pdfkit');
const fs = require('fs');
var pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('text_styling2.pdf'));
pdfDoc
.fillColor('blue')
.text("This text is blue and italicized", {oblique : true, lineBreak : false})
.fillColor('red')
.text(" This text is red");
pdfDoc.end();
که نتیجه مطلوب را به ما می دهد:
ایجاد لیست ها
برای افزودن لیستی از موارد در سند PDF خود، PDFDocument
نمونه دارای الف است list()
تابعی که آرایهای از آیتمهای رشتهای (یا آرایههای تودرتوی رشتهها) را میگیرد و آنها را بهعنوان یک لیست گلوله نمایش میدهد:
const PDFDocument = require('pdfkit');
const fs = require('fs');
let pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('lists.pdf'));
let myArrayOfItems = ('Item 1', 'Item 2', 'Item 3', 'Item 4');
pdfDoc.list(myArrayOfItems);
// Move down a bit to provide space between lists
pdfDoc.moveDown(0.5);
let innerList = ('Nested Item 1', 'Nested Item 2');
let nestedArrayOfItems = ('Example of a nested list', innerList);
pdfDoc.list(nestedArrayOfItems);
pdfDoc.end();
که به ما می دهد:
فونت ها
PDFKit دارای 14 فونت استاندارد است که می تواند در اسناد PDF استفاده شود. هر یک از این فونت ها را می توان به font()
عملکرد از PDFDocument
کلاس، و زنجیر شده با text()
:
pdfDoc.font('Times-Roman').text('A text in Times Roman')
همچنین می توانید با ارسال مسیر به فایل فونت به عنوان آرگومان به فونت های اضافی اضافه کنید font()
تابع، و همچنین نام فونت خاصی که می خواهید در صورتی که فایل دارای مجموعه ای از فونت ها باشد. همچنین، میتوانید به فونت جدید یک نام بدهید تا به جای مسیر فایل، با آن نام قابل دسترسی باشد:
pdfDoc.registerFont('Name of the font', '/file_path', 'specific_font_name_in_case_of_a_collection')
تماس می گیرد به font()
را می توان با توابع دیگر زنجیر کرد، همانطور که در fillColor()
مثال.
همچنین می توانید اندازه فونت را با استفاده از fontSize()
تابع. بیایید به چند نمونه نگاهی بیندازیم:
const PDFDocument = require('pdfkit');
const fs = require('fs');
let pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('fonts.pdf'));
pdfDoc.font('ZapfDingbats').text('This is a symbolic font.');
pdfDoc.font('Times-Roman').fontSize(25).fillColor('blue').text('You can set a color for any font');
pdfDoc.font('Courier').fontSize(5).fillColor('black').text('Some text to demonstrate.');
pdfDoc.end();
با اجرای این، پی دی اف زیر را به عنوان خروجی به ما می دهد:
افزودن تصاویر
یکی دیگر از موارد متداول که ممکن است بخواهید به فایل های PDF خود اضافه کنید، تصاویر است. می توانید تماس بگیرید image()
تابع روی نمونه سند و مسیر یا URI تصویری را که می خواهید اضافه کنید عبور دهید.
همچنین میتوانید گزینههایی مانند عرض، ارتفاع، تراز افقی و عمودی تصویر را با ارسال یک شی حاوی جفتهای کلید-مقدار بهعنوان آرگومان به تصویر تنظیم کنید. image()
تابع. به طور پیش فرض، تصاویر در اندازه اصلی خود بارگذاری می شوند.
اگر تنظیم کنید width
و height
– تصویر کشیده خواهد شد تا در پارامترهای مشخص شده قرار گیرد. اگر یکی از این موارد حذف شود، تصویر متناسب با پارامتر ارائه شده مقیاس می شود:
const PDFDocument = require('pdfkit');
const fs = require('fs');
let pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('images.pdf'));
pdfDoc.text('By default, the image is loaded in its full size:')
pdfDoc.image('raspberries.jpg');
pdfDoc.moveDown(0.5)
pdfDoc.text('Scaled to fit width and height')
pdfDoc.image('raspberries.jpg', {width: 150, height: 150});
pdfDoc.moveDown(0.5)
pdfDoc.text('Scaled to fit width')
pdfDoc.image('raspberries.jpg', {width: 150});
pdfDoc.end();
اجرای این کد به ما می دهد:
شما همچنین می توانید تصویر را با دادن یک مقیاس بزرگ کنید scale
عامل. علاوه بر این، شما می توانید یک fit
یا cover
آرایه، که در آن تصویر به ترتیب برای مطابقت با مستطیل ارائه شده یا پوشاندن آن کوچک می شود. اگر الف ارائه کنید fit
یا cover
آرایه، شما همچنین می توانید تراز افقی را تنظیم کنید (align
) و تراز عمودی (valign
):
const PDFDocument = require('pdfkit');
const fs = require('fs');
let pdfDoc = new PDFDocument;
pdfDoc.pipe(fs.createWriteStream('images.pdf'));
pdfDoc.text('Scaled by a factor, keeps the original proportions:')
pdfDoc.image('raspberries.jpg', {scale: 0.75});
pdfDoc.moveDown(0.5)
pdfDoc.text('Fit with horizontal alignment:')
pdfDoc.image('raspberries.jpg', {fit: (400, 150), align: 'center'});
pdfDoc.end();
این به ما می دهد:
نتیجه
در این مقاله روش تولید فایل های PDF در Node.js با استفاده از PDFKit را مشاهده کردیم. ما برخی از گزینه های موجود برای قالب بندی متن و روش افزودن تصاویر به فایل های خود را بررسی کرده ایم. کتابخانه گسترده است مستندات که خیلی چیزهای بیشتری را پوشش می دهد روی ایجاد فایل های PDF در برنامه های Node.js.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-19 15:49:05