使用 libHaru 库在 C++ 中生成 PDF 报告

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

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

开始课程

使用 libHaru 在 C++ 中生成 PDF 报告



在现代编程中,经常需要以编程方式创建 PDF 格式的文档。这些文档可以是报告、发票、运单、分析摘要,或者只是以通用格式保存数据。在 C++ 语言中,有多个库可用于此目的,其中最流行的之一就是 libHaru(也称为 Haru PDF)。



libHaru 是一个用 C 语言编写并具有便捷 C++ 接口的开源跨平台库。它允许在无需外部依赖(无需安装 Ghostscript、LaTeX 或其他系统)的情况下创建 PDF 文档。该库支持文本处理(包括通过编码支持 Unicode)、嵌入图像(PNG、JPEG)、绘制线条、矩形、圆形,以及创建注释和超链接。



安装与配置



libHaru 的源代码可以从 GitHub 官方仓库 下载。使用 CMake 进行构建。在 Linux 上的安装示例:



git clone https://github.com/libharu/libharu.gitcd libharumkdir build && cd buildcmake ..makesudo make install


安装后,在您的项目中包含头文件并链接库:



#include <hpdf.h>

// 链接:-lhpdf


创建简单的 PDF 文档



我们来看一个基本示例——创建一个包含一页和文本的文档。C++ 代码如下:



#include <hpdf.h>#include <stdio.h>

int main() { HPDF_Doc pdf = HPDF_New(NULL, NULL); if (!pdf) { fprintf(stderr, "创建 PDF 失败"); return 1; }

HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_LANDSCAPE);

HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", NULL); HPDF_Page_SetFontAndSize(page, font, 20);

HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, 100, 400, "你好,世界!这是一份 C++ 的 PDF 报告。"); HPDF_Page_EndText(page);

HPDF_SaveToFile(pdf, "output.pdf"); HPDF_Free(pdf); printf("PDF 已创建:output.pdf"); return 0;}


这段代码创建了一个 A4 横向页面,输出文本(默认黑色)并保存结果。请注意:libHaru 不直接支持 Helvetica 等字体中的西里尔字母——对于俄语文本,需要使用 TrueType 字体,如下所示。



处理俄语文本和字体



为了正确显示西里尔字母,需要加载支持 Unicode 的字体(例如 Arial 或 Times New Roman)。示例:



// 加载 TrueType 字体(文件必须可访问)const char* font_path = "/usr/share/fonts/truetype/arial.ttf";HPDF_Font font = HPDF_GetFont(pdf, font_path, NULL);

// 或者使用带有 UTF-8 编码的内置字体HPDF_UseUTFEncodings(pdf);HPDF_Font font = HPDF_GetFont(pdf, "Helvetica", "UTF-8");


第一种方法更可靠,但需要在目标系统上存在字体文件。第二种方法仅适用于某些内置字体,并且不能保证完全支持西里尔字母。



绘制表格和图形元素



为了创建报告,经常需要绘制表格。libHaru 允许绘制线条和矩形:



HPDF_Page_SetLineWidth(page, 1);HPDF_Page_SetRGBStroke(page, 0, 0, 0);

// 绘制矩形 (x, y, width, height)HPDF_Page_Rectangle(page, 50, 500, 200, 30);HPDF_Page_Stroke(page);

// 绘制线条HPDF_Page_MoveTo(page, 50, 500);HPDF_Page_LineTo(page, 250, 500);HPDF_Page_Stroke(page);


可以组合线条和文本来创建完整的表格。对于包含动态数据的复杂报告,编写一个接受字符串数组的辅助函数会很方便。

推荐