使用 libharu 和 PoDoFo 在 C++ 中生成 PDF 报告

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 C++ 中生成 PDF 报告:库概述与实践示例



在现代软件开发中,经常需要生成打印文档、分析报告或账单。C++ 语言提供了处理 PDF 的强大工具,但选择合适的库可能并不简单。在本文中,我们将探讨三种主要方法:直接对 PDF 进行底层操作 (libharu)、使用文档对象模型 (PoDoFo) 以及将 HTML 转换为 PDF (wkhtmltopdf)。针对每种方法,我们都提供了代码示例并指出了其应用领域。



1. libharu 库——极简方法



libharu 是一个轻量级的纯 C 库,与 C++ 完全兼容。它不需要外部依赖,允许您通过控制每个页面、字体和线条来创建 PDF 文件。非常适合只需要文本、表格和基本图形的简单报告。



安装

# Linux (Debian/Ubuntu)sudo apt-get install libhpdf-dev

# Windows (vcpkg)vcpkg install libharu


示例:创建带表格的报告

#include <hpdf.h>#include <iostream>

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_Page_BeginText(page); HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Helvetica", NULL), 18); HPDF_Page_TextOut(page, 50, 750, "第一季度销售报告"); HPDF_Page_EndText(page);

// 表格:单元格坐标 const char* headers[] = {"商品", "数量", "价格, 卢布"}; const char* data[][3] = {{"笔记本电脑", "12", "85000"}, {"鼠标", "45", "1200"}, {"键盘", "30", "3500"}}; float y = 700; HPDF_Page_SetFontAndSize(page, HPDF_GetFont(pdf, "Courier", NULL), 12); for (int i = 0; i < 3; ++i) { HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 50, y, headers[i]); HPDF_Page_TextOut(page, 200, y, data[0][i]); HPDF_Page_TextOut(page, 350, y, data[1][i]); HPDF_Page_TextOut(page, 500, y, data[2][i]); HPDF_Page_EndText(page); y -= 20; }

HPDF_SaveToFile(pdf, "report_libharu.pdf"); HPDF_Free(pdf); std::cout << "PDF 已创建: report_libharu.pdf" << std::endl; return 0;}


优点: 体积最小,无依赖,快速上手。
缺点: 不原生支持西里尔字母(需要手动编码字体),难以创建复杂布局。



2. PoDoFo——文档对象模型



PoDoFo 是一个现代的 C++ 库,支持 Unicode、字体嵌入、图像和表单处理。它提供了类似于 HTML 布局的高级 API。非常适合包含西里尔字母、表格和嵌入字体的报告。



安装

# Linuxsudo apt-get install libpodofo-dev

# Windows (vcpkg)vcpkg install podofo


示例:包含西里尔字母和表格的报告

#include <podofo/podofo.h>#include <iostream>

int main() { using namespace PoDoFo;

PdfMemDocument document; PdfPage* page = document.CreatePage(PdfPage::CreateStandardPageSize(PdfPageSize::A4)); PdfPainter painter; painter.SetCanvas(page);

// 加载支持西里尔字母的字体 const char* fontPath = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"; PdfFont* font = document.CreateFont(fontPath); font->SetFontSize(16); painter.SetFont(font);

// 标题 painter.DrawText("“阿尔法”项目报告", 50, 750);

// 表格(手动绘制线条) painter.SetStrokeWidth(1); painter.DrawLine(50, 720, 550, 720);

推荐