PDF库 libharu 简单操作
一、编译
官方编译指导:https://github.com/libharu/libharu/wiki/Installation
1. 解压
tar -zxvf libharu-libharu-v2.4.3-0-g8dbcfe4.tar 2.在解压出来文件夹中创建一个build文件夹
mkdir build 3.进入build文件夹
cd build 4.使用cmake编译
cmake .. 5.make编译
make 6.编译出来的 libhpdf.so 就是我们需要的库文件
*:在引入头文件时,需要把 build/include/hpdf_config.h 文件一起拿出来,不然会报错缺少文件
二、基本使用
// 简单添加一张图片到PDF文件中,图片按比例显示,PDF文件页面边距50px
int main2()
{
HPDF_Doc pdf = HPDF_New(NULL, NULL); // 创建PDF文件和页面
HPDF_Page page = HPDF_AddPage (pdf);
HPDF_Page_SetSize (page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
HPDF_REAL page_width = HPDF_Page_GetWidth(page);
HPDF_REAL page_height = HPDF_Page_GetHeight(page);
cout << "page width:" << page_width << " height:" << page_height << endl; // 加载图片到页面上,PDF的坐标是从左下角计算的
HPDF_Image image = HPDF_LoadJpegImageFromFile (pdf, "./files/1.jpg");
HPDF_REAL width = HPDF_Image_GetWidth(image);
HPDF_REAL height = HPDF_Image_GetHeight(image);
HPDF_REAL image_scale = width / (page_width-100);
HPDF_Page_DrawImage(page, image, 50, page_height - height / image_scale - 50, width / image_scale, height / image_scale);
cout << "image width:" << width << " height:" << height << endl; HPDF_SaveToFile (pdf, "1.pdf");
HPDF_Free (pdf); cout << "save success" << endl; return 0;
}
// 添加多张图片到PDF文件中,一张图片一个页面
int main()
{
HPDF_Doc pdf = HPDF_New(NULL, NULL); vector<string> files = {"./files/1.jpg", "./files/2.jpg", "./files/3.jpg"};
for(int i=0; i<files.size(); i++)
{
HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetSize (page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT); HPDF_Image image = HPDF_LoadJpegImageFromFile(pdf, files.at(i).c_str());
HPDF_Page_DrawImage(page, image, 50, 50, HPDF_Image_GetWidth(image), HPDF_Image_GetHeight(image));
} HPDF_SaveToFile(pdf, "2.pdf");
HPDF_Free(pdf);
}
// 图片是什么尺寸,PDF的page页面就是什么尺寸
int main()
{
HPDF_Doc pdf = HPDF_New(NULL, NULL);
HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL); // 压缩 vector<string> files = { "./files/1.jpg", "./files/2.jpg", "./files/3.jpg" };
for (int i = 0; i < files.size(); i++)
{
HPDF_Image image = HPDF_LoadJpegImageFromFile(pdf, files.at(i).c_str());
HPDF_REAL image_width = HPDF_Image_GetWidth(image);
HPDF_REAL image_height = HPDF_Image_GetHeight(image); HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetWidth(page, image_width);
HPDF_Page_SetHeight(page, image_height); // 设置缩放
HPDF_Destination dst = HPDF_Page_CreateDestination(page);
HPDF_Destination_SetXYZ(dst, 0, HPDF_Page_GetHeight(page), 1);
HPDF_SetOpenAction(pdf, dst); HPDF_Page_DrawImage(page, image, 0, 0, image_width, image_height);
} HPDF_SaveToFile(pdf, "1.pdf");
HPDF_Free(pdf);
}
PDF库 libharu 简单操作的更多相关文章
- spider _其他库的简单操作与方法
PHP : 网络IO java : 代码笨重,代码量很大 C/C++ :虽然效率高,但是代码成型很慢 1 通用网络爬虫(搜索引擎引用,需要遵守robots协议) 1 搜索引擎如何获取一个新网站的 UR ...
- TortoiseSVN搭建本地版本库及简单操作使用
TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...
- TortoiseSVN 搭建本地版本库及简单操作使用
TortoiseSVN是windows上一款著名的版本控制软件,对于我们管理自己的代码,特别是对一个团队来说,非常重要. 本文探讨的是如何搭建本地的版本库. (1)安装TortoiseSVN之后需要创 ...
- Python 数据分析中金融数据的来源库和简单操作
目录 金融数据 pandas-datareader TuShare 金融学图表 案例 金融数据 数据分析离不开数据的获取,这里介绍几种常用的获取金融方面数据的方法. pandas-datareader ...
- python操作JIRA的库简单操作
因公司需要,我们开发的PRISM又需要和JIRA对接啦, 今天找了一个JIRA库撸了一发~~~ jira库地址: https://pypi.python.org/pypi/jira/1.0.3 简单操 ...
- C++标准库<string>简单总结
C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...
- app 下载更新 file-downloader 文件下载库的简单介绍和使用
app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...
- MongoDB数据库简单操作
之前学过的有mysql数据库,现在我们学习一种非关系型数据库 一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数 ...
- MongoDB的简单操作
一.简介 二.MongoDB基础知识 三.安装 四.基本数据类型 五.增删改查操作 六.可视化工具 七.pymongo 一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoD ...
- Linux下MySQL的简单操作
Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...
随机推荐
- 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009
问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...
- 一次生产环境OOM排查
一.背景 前几天下午飞书告警群里报起了java.lang.OutOfMemoryError: unable to create new native thread告警,看见后艾特了对应的项目负责人但是 ...
- 一文讲明白Java中线程与进程、并发与与并行、同步与异步
写在开头 ok,everybody,在过去的两周内,我们大体上讲完了Java的集合,在最后我们探讨了关于HashMap线程不安全的原因,又提出了ConcurrentHashMap这个线程安全的集合解决 ...
- 深入解析ASP.NET Core MVC应用的模块化设计[上篇]
ASP.NET Core MVC的"模块化"设计使我们可以构成应用的基本单元Controller定义在任意的模块(程序集)中,并在运行时动态加载和卸载.这种为"飞行中的飞 ...
- 解密prompt系列26. 人类思考vs模型思考:抽象和发散思维
在Chain of Thought出来后,出现过许多的优化方案例如Tree of thought, Graph of Thought, Algorithm of Thought等等,不过这些优化的出发 ...
- aardio用udp获取最佳本机IP地址
此方法在有多个网络接口的时候,例如部分虚拟网卡的情况,获取最合适的本地ip. 用UDP连接虚假IP地址以获取返回的本机IP import wsock.udp.client; import consol ...
- iVCam 可以当电脑的摄像头 同一个wifi
iVCam 可以当电脑的摄像头 同一个wifi
- 基于python的生理电信号采集的数据转换和处理软件
一 前记 团队开发了几款生物电信号采集系统,可数据处理和转换工具刚开始用的都是matlab.这对一些客户来说,使用门槛还是有些高了.开发一套配套的软件,满足广大用户的需求,已经是迫在眉睫的事情了.最近 ...
- 三种方式使用纯 CSS 实现星级评分
本文介绍三种使用纯 CSS 实现星级评分的方式.每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns="http://www.w3.org ...
- Android 混淆打包后gson报错Missing type parameter
原文: Android 混淆打包后gson报错Missing type parameter - Stars-One的杂货小窝 记录一个简单的bug 在代码中使用了gson将json转为list: va ...