کتابخانه رایگان C++ PDF برای خواندن و نوشتن فایلهای PDF
یک کتابخانه ساده منبع باز مبتنی بر C برای PDF که امکان خواندن، نوشتن و دستکاری اسناد PDF را فراهم میکند. این کتابخانه از تبدیل تصویر به PDF، استخراج محتوا، خواندن PDF به صورت جریاندار و موارد دیگر در برنامههای C پشتیبانی میکند.
کتابخانه PDFio چیست؟
PDFio یک کتابخانه سبک وزن و منبع باز زبان C است که بهطور خاص برای خواندن و نوشتن فایلهای PDF بدون پیچیدگی رندر یا نمایش طراحی شده است. این کتابخانه توسط مایکل آر. سوئیت ایجاد شده و تحت مجوز Apache License نسخه ۲.۰ منتشر میشود. این کتابخانه به توسعهدهندگان رویکردی ساده برای دستکاری PDF ارائه میدهد که بر ایجاد محتوا، استخراج و تبدیل تمرکز دارد نه ارائه بصری. کتابخانه بسیار آسان برای استفاده است و روشهای متعددی برای پردازش فایلهای PDF فراهم میکند، از جمله استخراج و ادغام صفحات PDF، گزارشهای خودکار از پایگاههای داده، افزودن واترمارک و مهر، ایجاد گواهینامه و دیپلم، جاسازی قلم برای بایگانی، تغییر متادیتا و موارد دیگر.
PDFio بر روی عملیاتهای ورودی/خروجی اساسی تمرکز دارد، که آن را برای برنامههایی که نیاز به استخراج دادهها از PDFها یا ایجاد PDFهای جدید دارند، بدون بار اضافی کتابخانههای پیچیده، ایدهآل میکند. این کتابخانه ویژگیهای قدرتمند تبدیل را پشتیبانی میکند و به توسعهدهندگان نرمافزار امکان میدهد تا markdown را به PDF، تصویر را به PDF، HTML را به PDF تبدیل کنند و همچنین تولید بارکد در PDFها را در برنامههای C انجام دهند. تمرکز آن بر عملکرد اصلی بدون هزینه رندرینگ، آن را برای برنامههای سمت سرور، ابزارهای خط فرمان و سیستمهای تعبیهشده که به ایجاد یا پردازش PDF بدون نمایش بصری نیاز دارند، مناسب میسازد. چه در حال ساخت سیستمهای مدیریت اسناد، ایجاد تولیدکنندگان گزارش خودکار، یا توسعه ابزارهای تحلیل PDF باشید، PDFio عملکرد اساسی مورد نیاز برای مدیریت حرفهای PDF در برنامههای C را ارائه میدهد.
شروع کار با PDFio
روش پیشنهادی برای نصب PDFio استفاده از NuGet است. لطفاً برای نصب آسان از دستور زیر استفاده کنید.
نصب PDFio از طریق NuGet
Install-Package pdfio_native نصب PDFio از طریق GitHub
git clone https://github.com/michaelrsweet/pdfio.git
همچنین میتوانید آن را بهصورت دستی نصب کنید؛ فایلهای آخرین نسخه را مستقیماً از مخزن GitHub دانلود کنید.
ایجاد یک PDF از ابتدا با استفاده از C
کتابخانه منبع باز PDFio پشتیبانی کامل برای ایجاد سند PDF جدید از ابتدا در برنامههای C را فراهم کرده است. ایجاد یک سند PDF جدید به همان اندازه ساده است و تنها با چند خط کد C، توسعهدهندگان نرمافزار میتوانند صفحات جدید اضافه کنند، متن و اشکال ساده را رسم کنند، تصاویر (فرمتهای JPEG، PNG) را اضافه کنند، رنگها و تبدیلات را اعمال کنند، جداول و طرحهای ساختاریافته بسازند و موارد بسیاری دیگر. در اینجا یک مثال ساده آورده شده است که نشان میدهد چگونه میتوان یک سند PDF جدید با اندازه صفحه سفارشی و محتوا با استفاده از کد C ایجاد کرد.
چگونه یک سند PDF ساده با اندازه صفحه سفارشی و محتوا با استفاده از کتابخانه C ایجاد کنیم؟
#include
#include
int main(void) {
pdfio_file_t *pdf;
pdfio_dict_t *dict;
pdfio_stream_t *page;
pdfio_obj_t *font;
pdfio_rect_t media_box = {0.0, 0.0, 612.0, 792.0}; // US Letter
pdfio_rect_t crop_box = {36.0, 36.0, 576.0, 756.0}; // 0.5" margins
// Create PDF file
pdf = pdfioFileCreate("output.pdf", "2.0",
&media_box, &crop_box,
NULL, NULL);
if (!pdf) {
fprintf(stderr, "Unable to create PDF\n");
return 1;
}
// Create a font object (Helvetica)
font = pdfioFileCreateFontObjFromBase(pdf, "Helvetica");
// Create page dictionary
dict = pdfioDictCreate(pdf);
pdfioPageDictAddFont(dict, "F1", font);
// Create the page
page = pdfioFileCreatePage(pdf, dict);
// Draw text
pdfioContentSetFillColorDeviceGray(page, 0.0); // Black color
pdfioContentTextBegin(page);
pdfioContentSetTextFont(page, "F1", 24.0);
pdfioContentTextMoveTo(page, 100.0, 700.0);
pdfioContentTextShow(page, false, "Hello, PDFio!");
pdfioContentTextEnd(page);
// Close page and file
pdfioStreamClose(page);
pdfioFileClose(pdf);
printf("PDF created successfully!\n");
return 0;
}
تبدیل تصویر به PDF با استفاده از کتابخانه C
تبدیل تصاویر به فرمت PDF یکی از رایجترین وظایف پردازش اسناد است. کتابخانه PDFio این کار را به سادگی انجام میدهد در حالی که کنترل دقیقی بر اندازه صفحه، قرارگیری تصویر، مقیاسبندی و متادیتا فراهم میکند. توسعهدهندگان نرمافزار میتوانند یک مبدل کامل تصویر به PDF بسازند که هم تصاویر تکتک و هم تبدیلهای دستهای را مدیریت کند. مثال زیر نشان میدهد چگونه توسعهدهندگان میتوانند یک تصویر را به PDF در داخل برنامههای C تبدیل کنند.
چگونه یک تصویر تک را به PDF تبدیل کنیم با استفاده از کتابخانه C؟
#include
#include
#include
bool create_pdf_from_image(const char *image_path,
const char *pdf_path,
const char *title) {
pdfio_file_t *pdf;
pdfio_obj_t *image;
pdfio_dict_t *page_dict;
pdfio_stream_t *page_stream;
pdfio_rect_t media_box;
double img_width, img_height;
double page_width, page_height;
double scale_x, scale_y, scale;
double x, y;
// Create the image object first to get dimensions
// We'll use a temporary PDF for this
pdfio_rect_t temp_box = {0, 0, 612, 792};
pdf = pdfioFileCreate(pdf_path, "2.0", &temp_box, NULL, NULL, NULL);
if (!pdf) {
fprintf(stderr, "Error: Cannot create PDF file\n");
return false;
}
// Set PDF metadata
if (title) {
pdfioFileSetTitle(pdf, title);
}
pdfioFileSetAuthor(pdf, "PDFio Image Converter");
pdfioFileSetCreator(pdf, "image2pdf v1.0");
// Load and embed the image
image = pdfioFileCreateImageObjFromFile(pdf, image_path, true);
if (!image) {
fprintf(stderr, "Error: Cannot load image file: %s\n", image_path);
pdfioFileClose(pdf);
return false;
}
// Get image dimensions in pixels
img_width = pdfioImageGetWidth(image);
img_height = pdfioImageGetHeight(image);
printf("Image dimensions: %.0f x %.0f pixels\n", img_width, img_height);
// Create page sized to image (assuming 72 DPI)
// This creates a PDF page that exactly fits the image
page_width = img_width;
page_height = img_height;
media_box.x1 = 0.0;
media_box.y1 = 0.0;
media_box.x2 = page_width;
media_box.y2 = page_height;
// Create page dictionary and add image resource
page_dict = pdfioDictCreate(pdf);
pdfioDictSetRect(page_dict, "MediaBox", &media_box);
pdfioPageDictAddImage(page_dict, "IM1", image);
// Create the page
page_stream = pdfioFileCreatePage(pdf, page_dict);
// Draw image at full size (no scaling)
pdfioContentDrawImage(page_stream, "IM1", 0, 0,
page_width, page_height);
// Close and save
pdfioStreamClose(page_stream);
pdfioFileClose(pdf);
printf("Successfully created PDF: %s\n", pdf_path);
return true;
}
int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Usage: %s [title]\n",
argv[0]);
return 1;
}
const char *title = (argc > 3) ? argv[3] : NULL;
if (!create_pdf_from_image(argv[1], argv[2], title)) {
return 1;
}
return 0;
}
خواندن PDF و استخراج متن با کتابخانه C
یکی از رایجترین کارها، خواندن و استخراج متن از یک فایل PDF است. کتابخانه منبع باز PDFio این فرآیند را بهصورت شهودی انجام میدهد و به توسعهدهندگان امکان میدهد تا از صفحات و جریانهای محتوای آن عبور کنند. این کتابخانه پشتیبانی کامل برای استخراج اطلاعات مفید از PDFهای موجود، مانند متن ساده، متادیتا، فونتهای جاسازیشده، اعداد، تصاویر، انگورها، نامها و موارد دیگر را فراهم میکند. مثال زیر نشان میدهد چگونه یک PDF موجود را باز کرده و اطلاعات پایهای آن را با استفاده از کتابخانه C استخراج کنیم.
چگونه متن ساده را از یک فایل PDF استخراج کنیم با استفاده از کتابخانه C؟
#include
#include
#include
// Callback function to handle text objects
static bool text_cb(const pdfio_text_t *text, void *data) {
// Simply print the text to stdout
printf("%s", text->utf8);
return true;
}
int main(void) {
pdfio_file_t *pdf;
pdfio_page_t *page;
// Open the PDF file for reading
pdf = pdfioFileOpen("example.pdf", NULL, NULL, NULL);
if (!pdf) {
fprintf(stderr, "Failed to open example.pdf\n");
return 1;
}
printf("PDF has %d pages.\n", pdfioFileGetNumPages(pdf));
// Read the first page (pages are 1-indexed)
page = pdfioFileGetPage(pdf, 1);
if (!page) {
fprintf(stderr, "Failed to read page 1\n");
pdfioFileClose(pdf);
return 1;
}
// Parse the page content and call our text_cb for each text object
if (!pdfioPageParseContents(page, text_cb, NULL, NULL, NULL)) {
fprintf(stderr, "Failed to parse page contents\n");
}
// Clean up
pdfioFileClose(pdf);
return 0;
}
خواندن کارآمد و مبتنی بر جریان
PDFio برای کارایی طراحی شده است. هنگام خواندن، تمام فایل را بهصورت یکجا در حافظه بارگذاری نمیکند. در عوض، از رویکرد پارسکردن کششی استفاده میکند که به شما امکان میدهد فایل را بهصورت بخشهای کوچک پردازش کنید. این برای مدیریت PDFهای بسیار بزرگ بدون مصرف تمام حافظه سیستم بسیار مهم است. تابع pdfioPageParseContents از مثال اول نمونهای برجسته از این مدل مبتنی بر جریان است. این تابع جریان محتوای صفحه را بهصورت متوالی میخواند و در حین پردازش رویدادها (مانند فراخوانی متن ما) را صادر میکند.