1. Товары
  2.   PDF
  3.   C++
  4.   PDFio
 
  

Бесплатная C++ PDF библиотека для чтения и записи PDF‑файлов

Простая открытая C‑библиотека PDF позволяет читать, записывать и манипулировать PDF‑документами. Она поддерживает конвертацию изображений в PDF, извлечение содержимого, потоковое чтение PDF и многое другое в C‑приложениях.

Что такое библиотека PDFio?

PDFio — это легковесная, открытая C‑библиотека, разработанная специально для чтения и записи PDF‑файлов без сложности рендеринга или просмотра. Созданная Майклом Р. Свитом и лицензированная по лицензии Apache 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 

Как преобразовать одно изображение в 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‑парсинга, позволяющий обрабатывать файл кусками. Это критически важно для работы с очень большими PDF без исчерпания системной памяти. Функция pdfioPageParseContents из первого примера является ярким примером этой потоковой модели. Она последовательно читает поток содержимого страницы, генерируя события (например, наш обратный вызов текста) по мере чтения.

 Русский