C++ PDF生成:库概览与实践示例
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 buildcmake .. -DLIBHPDF_SHARED=ONmakesudo 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, "你好,世界!来自C++的PDF。"); HPDF_Page_EndText(page);
HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("PDF已创建:output.pdf"); return 0;}libharu的功能
- 创建多页文档
- 矢量图形(线条、矩形、曲线)
- 嵌入JPEG/PNG图像
- 支持书签(大纲)和注释
- 页面内容压缩
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 — 通过C++将HTML转换为PDF
wkhtmltopdf是一个命令行工具,使用WebKit引擎将HTML页面转换为PDF。对于C++,您可以通过system()或<