PDF генерация в C++: обзор библиотек и инструментов
Генерация PDF-документов — одна из частых задач в разработке программного обеспечения на C++. От формирования простых отчетов до создания сложных многостраничных документов с таблицами, изображениями и графикой. В этой статье мы рассмотрим наиболее популярные библиотеки и инструменты для работы с PDF на C++, их возможности, преимущества и недостатки, а также приведем практические примеры кода.
Зачем нужна генерация PDF в C++?
PDF (Portable Document Format) — кроссплатформенный формат, который сохраняет верстку документа независимо от устройства и операционной системы. В C++ генерация PDF требуется для:
- Создания отчетов и счетов в бизнес-приложениях
- Формирования документации из шаблонов
- Экспорта данных из баз данных
- Генерации чеков и накладных в системах учета
Основные библиотеки для работы с PDF в C++
1. libharu (HARU PDF)
Одна из самых популярных и простых в использовании библиотек для генерации PDF. Написана на C, но имеет отличный C++ интерфейс. Позволяет создавать PDF-документы с нуля, добавлять текст, изображения, линии, прямоугольники, аннотации.
Особенности:
- Небольшой размер и высокая производительность
- Поддержка шрифтов TrueType
- Сжатие страниц
- Работа с изображениями (JPEG, PNG)
- Лицензия: ZLIB/Libpng (свободная)
Пример генерации простого PDF:
#include <hpdf.h>
#include <stdio.h>
int main() {
HPDF_Doc pdf = HPDF_New(NULL, NULL);
HPDF_Page page = HPDF_AddPage(pdf);
// Устанавливаем размер страницы A4
HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);
// Добавляем текст
HPDF_Page_BeginText(page);
HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 24);
HPDF_Page_TextOut(page, 100, 500, "Привет, мир PDF на C++!");
HPDF_Page_EndText(page);
// Сохраняем документ
HPDF_SaveToFile(pdf, "output.pdf");
HPDF_Free(pdf);
return 0;
}
2. PoDoFo
Современная C++ библиотека с открытым исходным кодом для работы с PDF. Поддерживает не только создание, но и редактирование существующих PDF-файлов. Хорошо документирована и активно поддерживается.
Особенности:
- Чистый C++ код (современные стандарты)
- Поддержка Unicode и кириллицы
- Работа с формами, закладками, метаданными
- Чтение и запись PDF
- Лицензия: LGPL
Пример создания PDF с таблицей:
#include <podofo/podofo.h>
using namespace PoDoFo;
int main() {
PdfMemDocument document;
PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
PdfPainter painter;
painter.SetCanvas(*page);
// Рисуем таблицу
painter.DrawRect(50, 700, 500, 30);
painter.DrawText(60, 710, "Заголовок таблицы");
// Сохраняем
painter.FinishPage();
document.Save("table.pdf");
return 0;
}
3. wkhtmltopdf
Не библиотека в классическом смысле, а утилита командной строки, использующая движок WebKit для конвертации HTML в PDF. В C++ можно вызывать её через system() или использовать библиотеку-обертку.
Особенности:
- Идеально для генерации PDF из HTML-шаблонов
- Поддержка CSS, JavaScript, SVG
- Качественная верстка (как в браузере)
- Колонтитулы, оглавление, нумерация страниц
- Лицензия: LGPLv3
Пример вызова из C++:
#include <cstdlib>
int main() {
// Конвертируем HTML файл в PDF
int result = std::system("wkhtmltopdf input.html output.pdf");
if (result == 0) {
// Успешно
}
return 0;
}
4. QPdfWriter (Qt)
Если вы используете фрей