PDF генерация в C++: обзор библиотек и инструментов
Генерация PDF-документов — одна из частых задач в разработке программного обеспечения. Отчёты, счета, сертификаты, документация — всё это требует надёжного и гибкого инструмента для создания PDF. В экосистеме C++ существует несколько проверенных решений, каждое из которых имеет свои сильные стороны. В этой статье мы рассмотрим основные библиотеки и инструменты, которые помогут вам реализовать генерацию PDF на C++, а также приведём примеры кода для каждой из них.
1. PoDoFo — мощная библиотека для работы с PDF
PoDoFo — это кроссплатформенная библиотека на C++, предназначенная для создания, редактирования и анализа PDF-документов. Она предоставляет полный контроль над структурой файла, поддерживает шрифты, изображения, аннотации и формы.
Основные возможности:
- Создание PDF с нуля и редактирование существующих документов
- Поддержка TrueType, Type1 и стандартных шрифтов PDF
- Встраивание изображений (PNG, JPEG, TIFF)
- Работа с таблицами и многостраничными документами
- Поддержка сжатия и шифрования
Пример кода: создание простого PDF с текстом
#include <podofo/podofo.h>
using namespace PoDoFo;
int main() {
PdfMemDocument document;
PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4));
PdfPainter painter;
painter.SetPage(page);
// Устанавливаем шрифт
PdfFont* font = document.CreateFont("Arial");
painter.SetFont(font, 12.0);
// Рисуем текст
painter.DrawText("Привет, мир PDF!", 50, 700);
painter.FinishPage();
document.Save("output_podofo.pdf");
return 0;
}
2. libharu — лёгкая и быстрая библиотека
libharu (или HPDF) — это минималистичная библиотека на C для генерации PDF. Несмотря на то, что она написана на C, она прекрасно работает с C++ и не требует сложных зависимостей. libharu идеально подходит для простых задач, где не нужна полная поддержка PDF-стандарта.
Основные возможности:
- Поддержка текста, изображений, линий и прямоугольников
- Работа с кириллицей через кодировки
- Сжатие страниц
- Лицензия Zlib (свободная)
Пример кода: создание PDF с изображением
#include <hpdf.h>
#include <stdio.h>
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);
// Загружаем изображение
HPDF_Image image = HPDF_LoadJpegImageFromFile(pdf, "example.jpg");
HPDF_Page_DrawImage(page, image, 50, 500, 200, 150);
// Текст
HPDF_Page_BeginText(page);
HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 14);
HPDF_Page_TextOut(page, 50, 700, "Пример с изображением");
HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output_libharu.pdf");
HPDF_Free(pdf);
return 0;
}
3. wkhtmltopdf — конвертация HTML в PDF
wkhtmltopdf — это не библиотека в классическом смысле, а утилита командной строки, основанная на WebKit. Однако её можно легко вызывать из C++ кода через system() или popen(). Это идеальный выбор, если вам нужно превратить HTML-шаблон в PDF-документ с сохранением стилей и вёрстки.
Основные возможности:
- Поддержка CSS, JavaScript, таблиц и изображений
- Настройка полей, ориентации, колонтитулов
- Высокое качество рендеринга
- Простота интеграции
Пример кода: вызов wkhtmltopdf из C++
#include <cstdlib>
#include <string>
int main() {
std::string input = "report.html";
std::string output = "report.pdf";
std::string cmd = "wkhtmltopdf --margin-top 10mm --margin-bottom 10mm "
+ input + " " + output;
int result = std::system(cmd.c_str());
if (result == 0) {
// Успешно
} else {
// Ошибка
}
return 0;
}