C++ PDF生成:库与工具概览
生成PDF文档是C++软件开发中的常见任务之一。从创建简单的报表到生成包含表格、图像和图形的复杂多页文档。本文将介绍最流行的C++ PDF处理库和工具,分析其功能、优缺点,并提供实用的代码示例。
为什么需要在C++中生成PDF?
PDF(便携式文档格式)是一种跨平台格式,无论设备或操作系统如何,都能保持文档排版。在C++中,生成PDF常用于:
- 在商业应用中创建报表和发票
- 根据模板生成文档
- 从数据库导出数据
- 在会计系统中生成收据和运单
C++中主要的PDF处理库
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, "你好,C++ PDF世界!"); 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()调用,或使用封装库。
特点:
- 非常适合从HTML模板生成PDF
- 支持CSS、JavaScript、SVG
- 高质量排版(如同浏览器渲染)
- 支持页眉页脚、目录、页码
- 许可证:LGPLv3
从C++调用的示例:
#include <cstdlib>
int main() { // 将HTML文件转换为PDF int result = std::system("w