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

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

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

Начать курс

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

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

Зачем нужна генерация PDF в C++?

PDF (Portable Document Format) — кроссплатформенный формат, который сохраняет верстку документа независимо от устройства и операционной системы. В C++ генерация PDF требуется для:

  • Создания отчетов и счетов в бизнес-приложениях
  • Формирования документации из шаблонов
  • Экспорта данных из баз данных
  • Генерации чеков и накладных в системах учета

Основные библиотеки для работы с PDF в C++

1. libharu (HARU PDF)

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

Особенности:

  • Небольшой размер и высокая производительность
  • Поддержка шрифтов TrueType
  • Сжатие страниц
  • Работа с изображениями (JPEG, PNG)
  • Лицензия: ZLIB/Libpng (свободная)

Пример генерации простого PDF:

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

int main() {
    HPDF_Doc pdf = HPDF_New(NULL, NULL);
    HPDF_Page page = HPDF_AddPage(pdf);
    
    // Устанавливаем размер страницы A4
    HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);
    
    // Добавляем текст
    HPDF_Page_BeginText(page);
    HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 24);
    HPDF_Page_TextOut(page, 100, 500, "Привет, мир PDF на C++!");
    HPDF_Page_EndText(page);
    
    // Сохраняем документ
    HPDF_SaveToFile(pdf, "output.pdf");
    HPDF_Free(pdf);
    return 0;
}

2. PoDoFo

Современная C++ библиотека с открытым исходным кодом для работы с PDF. Поддерживает не только создание, но и редактирование существующих PDF-файлов. Хорошо документирована и активно поддерживается.

Особенности:

  • Чистый C++ код (современные стандарты)
  • Поддержка Unicode и кириллицы
  • Работа с формами, закладками, метаданными
  • Чтение и запись PDF
  • Лицензия: LGPL

Пример создания PDF с таблицей:

#include <podofo/podofo.h>

using namespace PoDoFo;

int main() {
    PdfMemDocument document;
    PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
    PdfPainter painter;
    painter.SetCanvas(*page);
    
    // Рисуем таблицу
    painter.DrawRect(50, 700, 500, 30);
    painter.DrawText(60, 710, "Заголовок таблицы");
    
    // Сохраняем
    painter.FinishPage();
    document.Save("table.pdf");
    return 0;
}

3. wkhtmltopdf

Не библиотека в классическом смысле, а утилита командной строки, использующая движок WebKit для конвертации HTML в PDF. В C++ можно вызывать её через system() или использовать библиотеку-обертку.

Особенности:

  • Идеально для генерации PDF из HTML-шаблонов
  • Поддержка CSS, JavaScript, SVG
  • Качественная верстка (как в браузере)
  • Колонтитулы, оглавление, нумерация страниц
  • Лицензия: LGPLv3

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

#include <cstdlib>

int main() {
    // Конвертируем HTML файл в PDF
    int result = std::system("wkhtmltopdf input.html output.pdf");
    if (result == 0) {
        // Успешно
    }
    return 0;
}

4. QPdfWriter (Qt)

Если вы используете фрей

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