Генерация PDF на C++: обзор библиотек и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

PDF генерация в C++: обзор библиотек и практические примеры

Генерация PDF-документов — одна из частых задач в разработке корпоративных приложений, систем отчётности и документооборота. Несмотря на то, что C++ не имеет встроенной поддержки формата PDF, существует несколько зрелых библиотек, позволяющих создавать, редактировать и рендерить PDF-файлы. В этой статье мы разберём три популярных инструмента: libharu, PoDoFo и wkhtmltopdf. Для каждого приведём пример кода и опишем ключевые возможности.

1. libharu — лёгкая и быстрая генерация PDF

libharu (Haru PDF) — это кроссплатформенная библиотека на чистом C, которая отлично подходит для C++ проектов. Она не зависит от внешних графических библиотек, поддерживает Unicode (UTF-8), встраивание шрифтов (TrueType) и работу с изображениями (JPEG, PNG). Основной сценарий — программное создание документов «с нуля».

Установка

Скачайте исходный код с GitHub и соберите через CMake:

mkdir build && cd build
cmake .. -DLIBHPDF_SHARED=ON
make
sudo make install

Пример: создание простого PDF с текстом

#include <hpdf.h>
#include <cstdio>

int main() {
    HPDF_Doc pdf = HPDF_New(NULL, NULL);
    HPDF_Page page = HPDF_AddPage(pdf);
    HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);

    // Шрифт
    const char* font_name = HPDF_LoadTTFontFromFile(pdf, "arial.ttf", HPDF_TRUE);
    HPDF_Font font = HPDF_GetFont(pdf, font_name, "UTF-8");
    HPDF_Page_SetFontAndSize(page, font, 14);

    // Текст
    HPDF_Page_BeginText(page);
    HPDF_Page_TextOut(page, 50, 750, "Привет, мир! PDF из C++.");
    HPDF_Page_EndText(page);

    HPDF_SaveToFile(pdf, "output.pdf");
    HPDF_Free(pdf);
    printf("PDF создан: output.pdf\n");
    return 0;
}

Возможности libharu

  • Создание многостраничных документов
  • Векторная графика (линии, прямоугольники, кривые)
  • Встраивание изображений JPEG/PNG
  • Поддержка закладок (outline) и аннотаций
  • Сжатие содержимого страниц

2. PoDoFo — продвинутая работа с PDF

PoDoFo — C++ библиотека с полным контролем над структурой PDF. Она позволяет не только создавать, но и редактировать существующие документы, извлекать текст, управлять метаданными и шифрованием. PoDoFo использует CMake и требует незначительной настройки.

Установка (Ubuntu/Debian)

sudo apt install libpodofo-dev

Пример: добавление текста на страницу

#include <podofo/podofo.h>
using namespace PoDoFo;

int main() {
    PdfMemDocument document;
    document.SetPdfVersion(PdfVersion::V1_4);
    document.GetMetadata().SetTitle("Документ PoDoFo");

    PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
    PdfPainter painter;
    painter.SetCanvas(*page);

    PdfFont* font = document.CreateFont("Arial", false, false, false);
    font->SetFontSize(16);
    painter.SetFont(font);
    painter.DrawText(50, 700, "Сгенерировано с помощью PoDoFo!");

    painter.FinishDrawing();
    document.Save("podofo_example.pdf");
    return 0;
}

Сильные стороны PoDoFo

  • Поддержка PDF/A (архивный формат)
  • Шифрование и установка паролей
  • Извлечение текста и изображений из PDF
  • Работа с формами (AcroForms)
  • Редактирование существующих PDF (добавление/удаление страниц)

3. wkhtmltopdf — HTML в PDF через C++

wkhtmltopdf — это консольная утилита, которая конвертирует HTML-страницы в PDF с помощью движка WebKit. Для C++ вы можете вызывать её через system() или popen(). Идеально подходит, когда нужно генерировать сложные отчёты с таблицами и CSS-стилями.

Пример вызова из C++

Рекомендаций