基于libharu的PDF操作

        最近遇到一个项目,需要在虚幻中操作完成后输出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 <string>
#include <vector>
#include <map>

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<float> tablewidth, std::map<int, std::vector<std::string>>& 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<float> tablewidth{ 30,150,150 };
	std::map<int, std::vector<std::string>> tabletitleitems;
	tabletitleitems.insert(std::make_pair(0, std::vector<std::string>{"1", "Cygwin + GCC(微软视窗)", "如果您成功在其他平台上构建 HARU,请将 makefile 发送给我。"}));
	tabletitleitems.insert(std::make_pair(1, std::vector<std::string>{"2", "Cygwin + MinGW(微软视窗)", "Haru 可以用作静态库(.a、.lib)和共享库(.so、.dll)。"}));
	tabletitleitems.insert(std::make_pair(2, std::vector<std::string>{"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;
}

 

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

在Visual Studio中使用libharu库,需要先编译zlib库和libpng库,因为libharu依赖于这两个库。有两种编译方式:一种是将libharu、zlib、libpng都编译为动态库,这样在使用时需要引入这三个dll文件;另一种是将zlib和libpng编译为静态库,并将它们编译到libharu.dll中,这样在项目引用时只需要引入编译好的libharu.dll,而不需要引入zlib和libpng的dll文件。 要在Visual Studio中编译libharu,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装好了Visual Studio开发环境,并已经下载了libharu库的源代码。 2. 打开Visual Studio并打开命令提示控制台。 3. 在命令提示控制台中,切换到libharu源代码所在的目录。 4. 执行命令`nmake -f script/Makefile.msvc_dll`,这将会编译libharu,并生成包含了zlib和libpng代码的libharu.dll文件。 完成以上步骤后,你就可以在你的Visual Studio项目中引用编译好的libharu.dll文件来使用libharu库了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c语言导出pdf---libharu](https://blog.csdn.net/cs0988/article/details/53517951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Windows下基于Visual Studio编译libharu](https://blog.csdn.net/weixin_34221036/article/details/91771220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东风吹柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值