基于libharu的PDF操作

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

1.资源获取

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

        github源码:

https://github.com/libharu/libharu

2.编译文件详情

基于libharu的PDF操作_第1张图片

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

基于libharu的PDF操作_第2张图片

基于libharu的PDF操作_第3张图片

        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;
}

基于libharu的PDF操作_第4张图片基于libharu的PDF操作_第5张图片 

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

你可能感兴趣的:(Unreal,Engine,C/C++,ue5,PDF,C++)