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 ...
随机推荐
- 在Ubuntu搭建DHCP服务器
一.提供DHCP的服务器,自己必须有固定的IP地址 不然局域网就乱了,服务器自身启动(比如搭建完DHCP服务后,重新启动了服务器)的时候,DHCP服务器没有IP地址,无法和自己的DHCP服务通信. 在 ...
- 第一百零九篇:基本数据类型(String类型)
好家伙, 本篇内容为<JS高级程序设计>第三章学习笔记 1.String类型 字符串类型是最常用的几个基本类型之一 字符串可以使用双引号,单引号以及反引号(键盘左Tab上面那个)标示 ...
- DataGear 制作支持表单交互和多图表联动的数据可视化看板
对于数据可视化,有时需要根据用户输入的查询条件展示限定范围的数据图表,DataGear的看板表单功能可以快速方便地实现此类需求. 下面的看板示例,包含一个柱状图.一个饼图和一个地图,用户可以通过看板表 ...
- 【Openxml】如何为OpenXml元素创建超链接
已知在OpenXml有以下几种超链接 功能 说明 跳转页面 跳转某一页:ppaction://hlinksldjump跳转第一页:ppaction://hlinkshowjump?jump=first ...
- 【aspose-words】Aspose.Words for Java模板语法详细剖析
前言 缘由 aspose-words模板语法再了解 垂死病中惊坐起,小丑竟是我自己.对于aspose-words的使用本狗自以为已炉火纯青,遂在新的迭代任务中毛遂自荐,并在小姐姐面前吹了一个大牛,分分 ...
- Java 常用类 String的常用方法(1)
1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 import java.sql.SQLOutput; 6 impo ...
- 8、zookeeper的集群搭建
完全配置--https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_zkMulitServerSetup https://zoo ...
- Sagas论文原文读后总结
一.引子 分布式事务组件seata最近社区很活跃,刚好公司有对接seata的计划.刚好借此机会,彻底了解下seata的价值.其中有一个比较特殊的模式叫SAGA模式,听起来就很懵逼,按照官网的介绍起源于 ...
- [学习笔记]Rocket.Chat业务数据备份
Rocket.Chat 的业务数据主要存储于mongodb数据库的rocketchat库中,聊天中通过发送文件功能产生的文件储存于/app/uploads中(文件方式设置为"FileSyst ...
- ansible-vault 教程
基本使用 在编写playbook时,可能会涉及到一些敏感的数据,比如密码,当这些敏感数据以明文的方式存储在playbook中时,可能是不能被接受的,那么我们该怎么办呢?ansible官方已经考虑到了这 ...