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
/**
* 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
std::map
tabletitleitems.insert(std::make_pair(0, std::vector
tabletitleitems.insert(std::make_pair(1, std::vector
tabletitleitems.insert(std::make_pair(2, std::vector
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;
}
欢迎各位下载体验,有问题随时私信我。