Генерация PDF-отчётов на C++ с libharu и PoDoFo

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

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

Начать курс

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

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

1. Библиотека libharu — минималистичный подход

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

Установка

# Linux (Debian/Ubuntu)
sudo apt-get install libhpdf-dev

# Windows (vcpkg)
vcpkg install libharu

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

#include <hpdf.h>
#include <iostream>

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_Page_BeginText(page);
    HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 18);
    HPDF_Page_TextOut(page, 50, 750, "Отчёт о продажах за Q1");
    HPDF_Page_EndText(page);

    // Таблица: координаты ячеек
    const char* headers[] = {"Товар", "Кол-во", "Цена, руб."};
    const char* data[][3] = {{"Ноутбук", "12", "85000"},
                             {"Мышь", "45", "1200"},
                             {"Клавиатура", "30", "3500"}};
    float y = 700;
    HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Courier", NULL), 12);
    for (int i = 0; i < 3; ++i) {
        HPDF_Page_BeginText(page);
        HPDF_Page_TextOut(page, 50, y, headers[i]);
        HPDF_Page_TextOut(page, 200, y, data[0][i]);
        HPDF_Page_TextOut(page, 350, y, data[1][i]);
        HPDF_Page_TextOut(page, 500, y, data[2][i]);
        HPDF_Page_EndText(page);
        y -= 20;
    }

    HPDF_SaveToFile(pdf, "report_libharu.pdf");
    HPDF_Free(pdf);
    std::cout << "PDF создан: report_libharu.pdf" << std::endl;
    return 0;
}

Плюсы: минимальный размер, нет зависимостей, быстрый старт.
Минусы: нет поддержки кириллицы «из коробки» (требуется ручное кодирование шрифтов), сложно создавать сложные макеты.

2. PoDoFo — объектная модель документа

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

Установка

# Linux
sudo apt-get install libpodofo-dev

# Windows (vcpkg)
vcpkg install podofo

Пример: отчёт с кириллицей и таблицей

#include <podofo/podofo.h>
#include <iostream>

int main() {
    using namespace PoDoFo;

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

    // Загрузка шрифта с поддержкой кириллицы
    const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf";
    PdfFont* font = document.CreateFont(fontPath);
    font->SetFontSize(16);
    painter.SetFont(font);

    // Заголовок
    painter.DrawText("Отчёт по проекту «Альфа»", 50, 750);

    // Таблица (ручное рисование линий)
    painter.SetStrokeWidth(1);
    painter.DrawLine(50, 720, 550, 720); // верхняя линия
    painter.DrawText("Параметр", 60, 700);
    painter.DrawText("Значение", 300,                    

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