Генерация PDF отчётов на C++ с помощью libharu и PoDoFo
В современной разработке на C++ часто возникает необходимость программно создавать документы формата PDF: от простых текстовых отчётов до сложных многостраничных документов с таблицами, графиками и изображениями. В этой статье мы подробно рассмотрим две популярные библиотеки для генерации PDF на C++ — libharu и PoDoFo, а также приведём практические примеры их использования.
1. Библиотека libharu
libharu — это легковесная, кроссплатформенная библиотека для создания PDF-файлов на C. Она не зависит от внешних библиотек (кроме zlib для сжатия), поддерживает Unicode, встраивание шрифтов, изображений (JPEG/PNG) и базовые векторные примитивы. Идеально подходит для генерации простых отчётов, счетов, справок.
Установка (Linux / Windows)
- Linux (Ubuntu/Debian):
sudo apt-get install libhpdf-dev - Windows (vcpkg):
vcpkg install libharu - Windows (сборка из исходников): скачайте архив с GitHub, соберите через CMake.
Пример: создание простого PDF с текстом и линией
#include <hpdf.h>
#include <stdio.h>
int main() {
HPDF_Doc pdf = HPDF_New(NULL, NULL);
if (!pdf) { fprintf(stderr, "Ошибка создания документа\n"); return 1; }
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), 24);
HPDF_Page_TextOut(page, 50, 750, "Отчёт о продажах за Q1");
HPDF_Page_EndText(page);
// Линия под заголовком
HPDF_Page_SetLineWidth(page, 1.5);
HPDF_Page_MoveTo(page, 50, 735);
HPDF_Page_LineTo(page, 545, 735);
HPDF_Page_Stroke(page);
// Сохраняем
HPDF_SaveToFile(pdf, "report.pdf");
HPDF_Free(pdf);
printf("PDF создан: report.pdf\n");
return 0;
}
Пример: добавление таблицы (имитация)
libharu не имеет встроенного модуля таблиц, но их можно нарисовать вручную:
void draw_table(HPDF_Page page, float x, float y, float col_width, float row_height, int rows, int cols) {
for (int r = 0; r <= rows; ++r) {
HPDF_Page_MoveTo(page, x, y - r * row_height);
HPDF_Page_LineTo(page, x + cols * col_width, y - r * row_height);
HPDF_Page_Stroke(page);
}
for (int c = 0; c <= cols; ++c) {
HPDF_Page_MoveTo(page, x + c * col_width, y);
HPDF_Page_LineTo(page, x + c * col_width, y - rows * row_height);
HPDF_Page_Stroke(page);
}
}
2. Библиотека PoDoFo
PoDoFo — более современная и мощная библиотека на C++ с поддержкой C++17. Она предоставляет объектно-ориентированный API, работу с формами, аннотациями, закладками, встраивание шрифтов TrueType/OpenType, а также чтение и редактирование существующих PDF. PoDoFo лучше подходит для сложных отчётов с динамическим содержимым.
Установка
- Linux:
sudo apt-get install libpodofo-dev(версия может быть старой, лучше собрать из исходников) - Windows: через vcpkg:
vcpkg install podofo - Сборка из исходников: требуется CMake, zlib, libpng, freetype, fontconfig.
Пример: создание PDF с таблицей и изображением
#include <podofo/podofo.h>
#include <iostream>
int main() {
using namespace PoDoFo;
PdfMemDocument doc;
PdfPage* page = doc.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
PdfPainter painter;
painter.SetCanvas(*page);
// Шрифт
auto& font = doc.CreateFont("Helvetica", 12, false, PdfFontStyle::Regular);
painter.SetFont(font);
// Текст
painter.DrawText("Отчёт по проекту", 50, 750);
// Пря Также в библиотеке
Планировщик задач Kotlin: kotlinx.coroutines и библиотеки для фоновых задач
Авторизация и аутентификация в TypeScript: полное руководство
Dependency Injection контейнер для Go (Golang): Wire, Dig и Uber FX
Машинное обучение на Kotlin: обзор библиотек KMath, Smile, KotlinDL и DeepLearning4J
Работа с S3 и облачными хранилищами в Rust: библиотека aws-sdk-s3