Безкоштовна бібліотека C++ PDF для читання та запису PDF‑файлів
Проста бібліотека PDF з відкритим кодом на C дозволяє читати, записувати та маніпулювати PDF‑документами. Вона підтримує конвертацію зображень у PDF, витяг вмісту, потокове читання PDF та інше у C‑додатках.
Що таке бібліотека PDFio?
PDFio — це легка, з відкритим вихідним кодом C‑бібліотека, спеціально розроблена для читання та запису PDF‑файлів без складності рендерингу чи перегляду. Створена Майклом Р. Світом і ліцензована за Apache License Version 2.0, ця бібліотека надає розробникам простий підхід до маніпуляції PDF, орієнтований на створення, витяг та трансформацію вмісту, а не на візуальну презентацію. Бібліотека дуже проста у використанні і пропонує кілька способів обробки PDF‑файлів, таких як витяг та об’єднання сторінок PDF, автоматизовані звіти з баз даних, додавання водяних знаків і штампів, створення сертифікатів і дипломів, вбудовування шрифтів для архівування, модифікація метаданих та багато іншого.
PDFio зосереджений на основних операціях вводу/виводу, що робить його ідеальним для застосунків, які потребують витягування даних з 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 розроблений з урахуванням ефективності. При читанні він не завантажує весь файл у пам'ять одразу. Замість цього використовується підхід pull‑parsing, що дозволяє обробляти файл частинами. Це критично важливо для роботи з дуже великими PDF без вичерпання системної пам'яті. Функція pdfioPageParseContents з першого прикладу є яскравим прикладом цієї потокової моделі. Вона читає потік вмісту сторінки послідовно, генеруючи події (наприклад, наш зворотний виклик тексту) під час процесу.