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

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

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

Начать курс

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

    // Пря                    

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