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

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

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

Начать курс

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

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

1. PoDoFo — мощная библиотека для работы с PDF

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

Основные возможности:

  • Создание PDF с нуля и редактирование существующих документов
  • Поддержка TrueType, Type1 и стандартных шрифтов PDF
  • Встраивание изображений (PNG, JPEG, TIFF)
  • Работа с таблицами и многостраничными документами
  • Поддержка сжатия и шифрования

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

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

int main() {
    PdfMemDocument document;
    PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
    PdfPainter painter;
    painter.SetPage(page);

    // Устанавливаем шрифт
    PdfFont* font = document.CreateFont("Arial");
    painter.SetFont(font, 12.0);

    // Рисуем текст
    painter.DrawText("Привет, мир PDF!", 50, 700);

    painter.FinishPage();
    document.Save("output_podofo.pdf");
    return 0;
}

2. libharu — лёгкая и быстрая библиотека

libharu (или HPDF) — это минималистичная библиотека на C для генерации PDF. Несмотря на то, что она написана на C, она прекрасно работает с C++ и не требует сложных зависимостей. libharu идеально подходит для простых задач, где не нужна полная поддержка PDF-стандарта.

Основные возможности:

  • Поддержка текста, изображений, линий и прямоугольников
  • Работа с кириллицей через кодировки
  • Сжатие страниц
  • Лицензия Zlib (свободная)

Пример кода: создание PDF с изображением

#include <hpdf.h>
#include <stdio.h>

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);

    // Загружаем изображение
    HPDF_Image image = HPDF_LoadJpegImageFromFile(pdf, "example.jpg");
    HPDF_Page_DrawImage(page, image, 50, 500, 200, 150);

    // Текст
    HPDF_Page_BeginText(page);
    HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 14);
    HPDF_Page_TextOut(page, 50, 700, "Пример с изображением");
    HPDF_Page_EndText(page);

    HPDF_SaveToFile(pdf, "output_libharu.pdf");
    HPDF_Free(pdf);
    return 0;
}

3. wkhtmltopdf — конвертация HTML в PDF

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

Основные возможности:

  • Поддержка CSS, JavaScript, таблиц и изображений
  • Настройка полей, ориентации, колонтитулов
  • Высокое качество рендеринга
  • Простота интеграции

Пример кода: вызов wkhtmltopdf из C++

#include <cstdlib>
#include <string>

int main() {
    std::string input = "report.html";
    std::string output = "report.pdf";
    std::string cmd = "wkhtmltopdf --margin-top 10mm --margin-bottom 10mm " 
                      + input + " " + output;
    int result = std::system(cmd.c_str());
    if (result == 0) {
        // Успешно
    } else {
        // Ошибка
    }
    return 0;
}

4. QPrinter (Qt Framework) — PDF через GUI

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