Генерация PDF отчётов на C++: библиотека libHaru

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

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

Начать курс

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

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