PDF генерация в C++: обзор библиотек и практические примеры
Генерация PDF-документов — одна из частых задач в разработке корпоративных приложений, систем отчётности и документооборота. Несмотря на то, что C++ не имеет встроенной поддержки формата PDF, существует несколько зрелых библиотек, позволяющих создавать, редактировать и рендерить PDF-файлы. В этой статье мы разберём три популярных инструмента: libharu, PoDoFo и wkhtmltopdf. Для каждого приведём пример кода и опишем ключевые возможности.
1. libharu — лёгкая и быстрая генерация PDF
libharu (Haru PDF) — это кроссплатформенная библиотека на чистом C, которая отлично подходит для C++ проектов. Она не зависит от внешних графических библиотек, поддерживает Unicode (UTF-8), встраивание шрифтов (TrueType) и работу с изображениями (JPEG, PNG). Основной сценарий — программное создание документов «с нуля».
Установка
Скачайте исходный код с GitHub и соберите через CMake:
mkdir build && cd build
cmake .. -DLIBHPDF_SHARED=ON
make
sudo make install
Пример: создание простого PDF с текстом
#include <hpdf.h>
#include <cstdio>
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);
// Шрифт
const char* font_name = HPDF_LoadTTFontFromFile(pdf, "arial.ttf", HPDF_TRUE);
HPDF_Font font = HPDF_GetFont(pdf, font_name, "UTF-8");
HPDF_Page_SetFontAndSize(page, font, 14);
// Текст
HPDF_Page_BeginText(page);
HPDF_Page_TextOut(page, 50, 750, "Привет, мир! PDF из C++.");
HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf");
HPDF_Free(pdf);
printf("PDF создан: output.pdf\n");
return 0;
}
Возможности libharu
- Создание многостраничных документов
- Векторная графика (линии, прямоугольники, кривые)
- Встраивание изображений JPEG/PNG
- Поддержка закладок (outline) и аннотаций
- Сжатие содержимого страниц
2. PoDoFo — продвинутая работа с PDF
PoDoFo — C++ библиотека с полным контролем над структурой PDF. Она позволяет не только создавать, но и редактировать существующие документы, извлекать текст, управлять метаданными и шифрованием. PoDoFo использует CMake и требует незначительной настройки.
Установка (Ubuntu/Debian)
sudo apt install libpodofo-dev
Пример: добавление текста на страницу
#include <podofo/podofo.h>
using namespace PoDoFo;
int main() {
PdfMemDocument document;
document.SetPdfVersion(PdfVersion::V1_4);
document.GetMetadata().SetTitle("Документ PoDoFo");
PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
PdfPainter painter;
painter.SetCanvas(*page);
PdfFont* font = document.CreateFont("Arial", false, false, false);
font->SetFontSize(16);
painter.SetFont(font);
painter.DrawText(50, 700, "Сгенерировано с помощью PoDoFo!");
painter.FinishDrawing();
document.Save("podofo_example.pdf");
return 0;
}
Сильные стороны PoDoFo
- Поддержка PDF/A (архивный формат)
- Шифрование и установка паролей
- Извлечение текста и изображений из PDF
- Работа с формами (AcroForms)
- Редактирование существующих PDF (добавление/удаление страниц)
3. wkhtmltopdf — HTML в PDF через C++
wkhtmltopdf — это консольная утилита, которая конвертирует HTML-страницы в PDF с помощью движка WebKit. Для C++ вы можете вызывать её через system() или popen(). Идеально подходит, когда нужно генерировать сложные отчёты с таблицами и CSS-стилями.