Генерация 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,