mupdf实用操作demo,C++操作PDF文件
前文:
最近有个项目,需要读写PDF,本来想着挺简单的,读写PDF有那么多的库可以使用,唰唰的就完成了。
忘记了我写C++的,还是在国产系统上开发的。
所以一般的东西还不好使,因为项目需要在多个架构的电脑上使用,所以必须要开源,还要支持读写才行。
找了很多个PDF库(libharu、mupdf、pdfium、pdflib)等,各种问题(找不到文档,不满足需求)等,好想有人能救救我。
这里不得不提的是 libharu 这个库很好使,简单,有文档,用的人多,唯一的不足是:只能写PDF文件,不支持读取PDF文件,看官方的意思,现在不支持,以后也不会支持,小小的遗憾。
有问题,找领导,嘿嘿,头天晚上提出问题,第二天上午就给了我 pdflib 和 mupdf 两个编译好的PDF库,可惜没文档,看接口猜着来用
pdflib非开源库,用的时候发现是个阉割版,只能读文件,无法写文件,哦豁一天结束了
mupdf开源库,久闻大名,功能齐全,可读可写,就是不好编译,调用复杂,反正现在有现成的编译好的库,那就直接使用呗,嘿,发现又是一个阉割版,很多接口调用不了,直接报错,跑不下去,哦豁,一天又结束了。
唉,求人不如求己,莫急,静下心来自己研究吧。
想着mupdf功能挺全的,就这个吧,就是有点大。
正文:
一、下载编译
mupdf 官网(我下载的是 mupdf-1.23.2-source.tar.gz 这个版本):https://www.mupdf.com/
不知道怎么编译,百度,忘记从哪里百度来的了,编译很简单,解压,然后直接 make,等待一会,会看到一个报错,缺个驱动,直接使用 apt 来安装就可以了,也可以忽略这个报错,这个不影响的,编译出来的库可以直接使用。
*:解压出来就是这样的
*:头文件在 include 文件夹
*:编译出来的库是静态库,在 build 文件夹,如下图
*:链接库使用的时候,这4个库都需要用到


二、使用前的唠叨
我的项目文件夹长这个样子,写个demo而已,比较乱也没有关系。编写Makefile,使用g++来编译。


三、示例代码
/**
* 添加一张图片到PDF的指定位置
* 加载一张图片,作为注释,添加到PDF的指定位置
*/
void addImageToPdf()
{
fz_context *ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
pdf_document *doc = pdf_open_document(ctx, "456.pdf");
pdf_page *page = pdf_load_page(ctx, doc, 0);
fz_image *image = fz_new_image_from_file(ctx, "2.jpg");
pdf_annot *annot = pdf_create_annot(ctx, page, PDF_ANNOT_SQUARE); // point 1 必须要小于 point 2,不然两个点的坐标会对调
int x = 100;
int y = pdf_bound_page(ctx, page, FZ_MEDIA_BOX).y1-300;
fz_rect rect = fz_make_rect(x, y, x+100,y+100);
// cout << "rect rect:" << rect.x0 << " - " << rect.y0 << " - "<< rect.x1 << " - "<< rect.y1 << endl; pdf_set_annot_rect(ctx, annot, rect);
pdf_set_annot_stamp_image(ctx, annot, image); pdf_write_options ops = pdf_default_write_options;
pdf_save_document(ctx, doc, "test.pdf", &ops); fz_drop_image(ctx, image);
pdf_drop_annot(ctx, annot);
pdf_drop_page_tree(ctx, doc);
pdf_drop_document(ctx, doc);
fz_drop_context(ctx);
}
/**
* 拆分PDF
* 将一个PDF文件,按页数拆分成多个png图片
* 支持设置dpi,如下demo示例是300dpi
*/
void splitPdfToPng()
{
fz_context* ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
fz_register_document_handlers(ctx);
fz_document* doc = fz_open_document(ctx, "123.pdf"); int num = fz_count_pages(ctx, doc);
cout << "page:" << num << endl; float zoom = (float)300 / (float)72;
fz_matrix ctm = fz_scale(zoom, zoom);
for(int i=0; i<num; i++)
{
string fileName = "./image/" + to_string(i) + ".png";
fz_pixmap* pix = fz_new_pixmap_from_page_number(ctx, doc, i, ctm, fz_device_rgb(ctx), 0);
fz_save_pixmap_as_png(ctx, pix, fileName.c_str());
fz_drop_pixmap(ctx, pix);
} fz_drop_document(ctx, doc);
fz_drop_context(ctx);
}
*:网上基本搜不到一个好的文档,大多都是转载,或者压根搜不到,沮丧。
mupdf这个开源库感觉大家的需求都是拆分PDF保存成图片,这个一搜一大堆,虽然代码跑不起来。不过还是很感谢,最少知道了应该去哪个头文件查接口。
然后只写了两个简单的demo,希望能帮助到大家
mupdf实用操作demo,C++操作PDF文件的更多相关文章
- 「Python实用秘技04」为pdf文件批量添加文字水印
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...
- vue项目中操作PDF文件
以前从来没接触过前端要求显示PDF文件,一时之间有点懵逼,不知从哪下手啊... 无奈之下,去找度娘,方法还不少,iframe embed object这些标签就可以, 可是拿过来做个demo一试, ...
- .net通过iTextSharp.pdf操作pdf文件实现查找关键字签字盖章
之前这个事情都CA公司去做的,现在给客户做demo,要模拟一下签字盖章了,我们的业务PDF文件是动态生成的所以没法通过坐标定位,只能通过关键字查找定位了. 之前在网上看了许多通多通过查询关键字,然后图 ...
- pdf文件之itextpdf操作实例
需求分析 1.需要创建一个pdf文件,包含文件的基本属性 2.文件需要包含附件,通过点击链接直接打开 3.生成的pdf文件不能直接修改(需要输入密码) 4.pdf文件需要有文字或图片水印 准备jar包 ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- PDF文件转换成Excel表格的操作技巧
我们都知道2007以上版本的Office文档,是可以直接将文档转存为PDF格式文档的.那么反过来,PDF文档可以转换成其他格式的文档吗?这是大家都比较好奇的话题.如果可以以其他格式进行保存,就可以极大 ...
- java操作Excel、PDF文件
java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...
- angular2之pdf文件操作大全
最近的项目中需要显示pdf内容.下载pdf.甚至是前端生成pdf 适用于angular2.4或者更高版本 情景1.需要将页面的某个部分转成pdf文件并下载(即将页面的部分html内容转成pdf文件) ...
- 记一次为解决Python读取PDF文件的Shell操作
目录 一.背景 二.问题 三.解决 四.一顿分析及 Shell 操作 五.后续 一.背景 本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件.有的是免费的.收费,咱也不 ...
- 强大的pdf文件操作小工具——PDFtk的小白用法 【转载】
转载出处https://www.cnblogs.com/basterdaidai/p/6204518.html 前言 作为程序员,大家都知道的,总是会被技术小白问各种跟编程没什么关系的硬件.软件问题. ...
随机推荐
- 用Visual Studio把代码放到GitLab
1.点"Git更改" 2.点"创建Git仓库--": 3.点"现有远程",再输入"远程URL": 4.在出现的警告框里选 ...
- 图查询语言 nGQL 简明教程 vol.01 快速入门
本文旨在让新手快速了解 nGQL,掌握方向,之后可以脚踩在地上借助文档写出任何心中的 NebulaGraph 图查询. 视频 本教程的视频版在B站这里. 准备工作 在正式开始 nGQL 实操之前,记得 ...
- FolkMQ 作个简单的消息中间件(最简单的那种), v1.3.1 发布
功能简介 角色 功能 生产端(或发起端) 发布消息.定时消息(或叫延时).顺序消息.可过期消息.事务消息.发送消息(rpc)支持 Qos0.Qos1 消费端(或接收端) 订阅.取消订阅.消费-ACK( ...
- 二十: MySql 事务日志
MySql 事务日志 事务有4种特性:原子性.一致性.隔离性和持久性.那么事务的四种特性到底是基于什么机制实现呢? 事务的隔离性由 锁机制 实现. 而事务的原子性.一致性和持久性由事务的 redo 日 ...
- C++ //count_if //按条件统计元素个数 //自定义和 内置
1 //按条件统计元素个数 2 //count_if 3 4 #include <iostream> 5 #include<string> 6 #include<vect ...
- 专访实在智能孙林君:颠覆传统RPA的实在IPA模式如何做到真正人人可用?
王吉伟对话实在智能孙林君:颠覆传统引领RPA行业的实在IPA模式是如何炼成的? 王吉伟对话实在智能孙林君:为什么第一款颠覆行业的RPA诞生在实在智能? 专访实在智能孙林君:打造出真正人人可用的实在 ...
- linux压缩文件并排除指定目录
今天要在linux上打包一个项目另作他用,但是项目图片都是放本地服务器的,整个项目打包好后有2G多下载十分费时.项目中的图片我们可以不要,所以压缩的时候要排除图片目录. 具体命令如下: // 参数说明 ...
- 轻松驾驭Python格式化:5个F-String实用技巧分享
F-String(格式化字符串字面值)是在Python 3.6中引入的,它是一种非常强大且灵活的字符串格式化方法. 它允许你在字符串中嵌入表达式,这些表达式在运行时会被求值并转换为字符串,这种特性使得 ...
- Zabbix“专家坐诊”第182期问答汇总
问题一: Q:像烽火.浪潮这种没有ilo的设备怎么监控他们的硬件状态呢? A:如果没有ilo,可以使用其他硬件监控软件,例如HP Insight Manager.IBM Director.Dell O ...
- 单词本z launch = to throw 相关词根 lanc ject jac jet bol bl bal mit miss cast
launch = to throw 词根 launc = lanc = to throw 表示 to throw 的词根有三组 拉丁语的lanc/launc,sip 拉丁语的ject, jac(jet ...