Генерация PDF отчётов на C++ с помощью libHaru
В современном программировании часто возникает необходимость программно создавать документы в формате PDF. Это могут быть отчёты, счета, накладные, аналитические сводки или просто сохранение данных в универсальном виде. На языке C++ для этих целей существует несколько библиотек, и одна из самых популярных — libHaru (также известная как Haru PDF).
libHaru — это кроссплатформенная библиотека с открытым исходным кодом, написанная на C и имеющая удобный C++ интерфейс. Она позволяет создавать PDF-документы без внешних зависимостей (не требует установки Ghostscript, LaTeX или других систем). Библиотека поддерживает работу с текстом (включая Unicode через кодировки), встраивание изображений (PNG, JPEG), рисование линий, прямоугольников, окружностей, а также создание аннотаций и гиперссылок.
Установка и подключение
Скачать исходники libHaru можно с официального репозитория на GitHub. Для сборки используется CMake. Пример установки на Linux:
git clone https://github.com/libharu/libharu.git
cd libharu
mkdir build && cd build
cmake ..
make
sudo make install
После установки подключите заголовочный файл и библиотеку в вашем проекте:
#include <hpdf.h>
// Линковка: -lhpdf
Создание простого PDF-документа
Рассмотрим базовый пример — создание документа с одной страницей и текстом. Код на C++:
#include <hpdf.h>
#include <stdio.h>
int main() {
HPDF_Doc pdf = HPDF_New(NULL, NULL);
if (!pdf) {
fprintf(stderr, "Ошибка создания PDF\n");
return 1;
}
HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);
HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", NULL);
HPDF_Page_SetFontAndSize(page, font, 20);
HPDF_Page_BeginText(page);
HPDF_Page_TextOut(page, 100, 400, "Привет, мир! Это PDF отчёт на C++.");
HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf");
HPDF_Free(pdf);
printf("PDF создан: output.pdf\n");
return 0;
}
Этот код создаёт альбомный лист A4, выводит текст синим цветом (по умолчанию чёрный) и сохраняет результат. Обратите внимание: libHaru не поддерживает кириллицу напрямую в шрифтах типа Helvetica — для русского текста потребуется TrueType шрифт, как показано ниже.
Работа с русским текстом и шрифтами
Чтобы корректно отображать кириллицу, необходимо загрузить шрифт, поддерживающий Unicode (например, Arial или Times New Roman). Пример:
// Загрузка TrueType шрифта (файл должен быть доступен)
const char* font_path = "/usr/share/fonts/truetype/arial.ttf";
HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);
// Или использовать встроенный шрифт с кодировкой UTF-8
HPDF_UseUTFEncodings(pdf);
HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");
Первый способ надёжнее, но требует наличия файла шрифта на целевой системе. Второй способ работает только с некоторыми встроенными шрифтами и не гарантирует полную поддержку кириллицы.
Рисование таблиц и графических элементов
Для создания отчётов часто нужно рисовать таблицы. libHaru позволяет рисовать линии и прямоугольники:
HPDF_Page_SetLineWidth(page, 1);
HPDF_Page_SetRGBStroke(page, 0, 0, 0);
// Рисуем прямоугольник (x, y, width, height)
HPDF_Page_Rectangle(page, 50, 500, 200, 30);
HPDF_Page_Stroke(page);
// Рисуем линию
HPDF_Page_MoveTo(page, 50, 500);
HPDF_Page_LineTo(page, 250, 500);
HPDF_Page_Stroke(page);
Можно комбинировать линии и текст для создания полноценной таблицы. Для сложных отчётов с динамическими данными удобно написать вспомогательную функцию, которая принимает массив строк и координаты, а затем рисует сетку и заполняет ячейки.
Встраивание изображений
Если отчёт содержит графики или логотипы, используйте HPDF_LoadPngImageFromFile или HPDF_LoadJpegImageFromFile:
HPDF_Image image = HPDF_Load