Безкоштовна бібліотека 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‑застосунках.

Previous Next

Початок роботи з 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 з першого прикладу є яскравим прикладом цієї потокової моделі. Вона читає потік вмісту сторінки послідовно, генеруючи події (наприклад, наш зворотний виклик тексту) під час процесу.

 Українська