基于libharu的PDF操作

2025-05-09 22:46:44154

最近遇到一个项目,需要在虚幻中操作完成后输出PDF评估报告。网上找了一圈,大佬推荐了一个库libharu,开源的,索性下载来自己封装成UE的第三方库。为了方便使用,我用Cpp封装了一些常用的操作方法,比如添加文字、图片、表格等。支持页边距、字号、行间距设置,页码采用自动编号(从1开始),可以缩放图片、自适应表格行高等。

1.资源获取

库地址:libharu库操作PDF文件-C++文档类资源-CSDN下载

github源码:

https://github.com/libharu/libharu

2.编译文件详情

按照UE第三方库惯例,bin里为动态库文件、include是头文件、lib里是引导文件。

test文件夹里包含一个测试案例。

主要的自定义接口如下,当然本文提供的文件里libharu库也是全的,大家可以自己基于库封装自定义的接口:

#ifndef _PDF_INTERFACE_H

#define _PDF_INTERFACE_H

#include

#include

#include

class PdfInterface

{

public:

/**

* SetFrame 新一页创建时被调用,用于初始化每页框架(外部结构、标题等)

* @para PageTitle 标题等

* @para enablepagetitle 是否显示标题

* @para isfirstpage 是否为首页

* @para fontsize 标题字号

* @para top 顶部页边距

* @para bottom 底部页边距

* @para left 左侧页边距

* @para right 右侧页边距

* @para default_line_space 默认字间距

*/

virtual void SetFrame(std::string PageTitle, bool enablepagetitle = false, bool isfirstpage = false, int fontsize = 20, float top = 50, float bottom = 50, float left = 50, float right = 50, float default_line_space = 4) = 0;

/**

* AddText 在页面添加文字(正文内容)

* @para content 准备添加的文字

* @para horoffsetleft 水平距离左侧页边距距离

* @para horoffsetright 水平距离右侧页边距距离

* @para fontsize 添加文字的字号

* @para line_space 文字行间距

*/

virtual void AddText(std::string content, int horoffsetleft = 0, int horoffsetright = 0, int fontsize = 16, float line_space = 4) = 0;

/**

* AddImage 在页面添加图片(正文内容)

* @para img 准备添加的图片,需要包含其路径

* @para title 添加图片的标题(默认剧中显示)

* @para fontsize 添加图片的标题字号

* @para scale 图片缩放比例

*/

virtual void AddImage(std::string img, std::string title, int fontsize = 12, float scale = 0.7) = 0;

/**

* AddTable 在页面添加表格(正文内容)

* @para tablewidth 表格项宽度(一般情况按比例设置就行)

* @para tabletitleitems 表格数据项

* @para tableitemfontsize 表格项字体

* @para tabletitle 表标题

* @para tabletitlefontsize 表格标题字体大小

*/

virtual void AddTable(std::vector tablewidth, std::map>& tableitems, int tableitemfontsize = 16, std::string tabletitle = "", int tabletitlefontsize = 12) = 0;

/**

* SaveToFile 保存所有操作到本地PDF文档中

* @para filename 文件名,不应该包含路径

* @para savepath 保存路径

*/

virtual void SaveToFile(std::string filename, std::string savepath) = 0;

};

#ifndef PDF_AMS

#define PDF_AMS

#endif

#ifdef __cplusplus

extern "C" {

#endif

PDF_AMS PdfInterface* __cdecl NewPdfInterface();

PDF_AMS void __cdecl DeletePdfInterface(PdfInterface* pdf);

#ifdef __cplusplus

}

#endif

#endif

3.输出演示

#include "PdfInterface.h"

int main()

{

PdfInterface* test = NewPdfInterface();

test->SetFrame("libharu简介", true, true);

test->AddText("1.源码获取", 16, 0, 20);

test->AddText(" https://github.com/libharu/libharu");

test->AddText(" 官方网址 http://libharu.org/");

test->AddImage("C:/Users/Administrator/Desktop/demo0.png", "图 1 libharu GitHub首页图");

test->AddText(" ", 16, 0, 12);

test->AddText("2.libharu支持平台", 16, 0, 20);

test->AddText(" Haru 是用 ANSI - C 编写的,应该可以使用任何兼容的 C 轻松编译编译器。我在以下环境中检查了 Haru 并为它们制作了文件环境包含在一个包中。");

std::vector tablewidth{ 30,150,150 };

std::map> tabletitleitems;

tabletitleitems.insert(std::make_pair(0, std::vector{"1", "Cygwin + GCC(微软视窗)", "如果您成功在其他平台上构建 HARU,请将 makefile 发送给我。"}));

tabletitleitems.insert(std::make_pair(1, std::vector{"2", "Cygwin + MinGW(微软视窗)", "Haru 可以用作静态库(.a、.lib)和共享库(.so、.dll)。"}));

tabletitleitems.insert(std::make_pair(2, std::vector{"3", "MSYS + MinGW (微软视窗)", "如果您为其他编程语言编写绑定,请通知我!"}));

std::string tabletitle = "表 1 libharu支持平台";

test->AddTable(tablewidth, tabletitleitems, 16, tabletitle);

test->AddText(" ", 16, 0, 12);

test->AddText("3.版权声明", 16, 0, 20);

test->AddText(" 本软件按“原样”提供,没有任何明示或暗示的保证。在任何情况下,作者均不对因以下原因造成的任何损害负责本软件的使用。允许任何人出于任何目的使用此软件,包括商业应用程序,并对其进行更改和自由重新分发。不得歪曲本软件的出处;你不能声称你写的原始软件。如果您在一个产品,产品文档中的确认将是");

test->AddText("赞赏但不是必需的。更改的源版本必须清楚地标明,并且不得被误认为是原始软件。");

test->SaveToFile("ams.pdf", "C:/Users/Administrator/Desktop/");

DeletePdfInterface(test);

return 0;

}

欢迎各位下载体验,有问题随时私信我。