如何在C++中使用mupdf操作pdf文件(一)

embedded/2024/12/22 6:22:13/

部署

mupdf是一个pdf库,不仅可以显示pdf文件,还可以创建、分割、合并、更改pdf文件。而且,除了pdf以外,它还支持mobi、epub、fb2等其它文件。

所以,如果我们有操作pdf等电子书的开发需求,使用mupdf是一个不错的选择。

需要强调的是,mupdf的核心API是C语言的

但是,它使用自动化地方式,支持C++、Python、C#等语言绑定。我们在不同的语言中使用的时候,直接使用官方的语言绑定就可以了。

Linux

在Linux系统中,有现成的mupdf的C++绑定开发库。虽然不同的发行版中名字不同,但是差异不大。

比如,在Fedora系统中,C语言的核心库叫做mupdf-devel,C++的绑定库叫做mupdf-cpp-devel。

执行

sudo dnf install mupdf-cpp-devel

之后,就自动安装好了。

安装之后,mupdf的头文件在/usr/include/mupdf目录中,动态链接库文件在/usr/lib64中,叫做libmupdfcpp.so(跟Windows中略有差异)。

Windows

在Windows系统中,需要自己编译一下,编译出C++需要的头文件和库,步骤略多一点。

首先,从github上检出mupdf的源代码。

git clone --recursive git://git.ghostscript.com/mupdf.git

注意,这里必须加上–recursive,因为有些第三方库的源文件需要同时检出。

如果忘了加上这个参数,就需要在检出的目录里,执行子模块的检出命令。

cd mupdf
git submodule update

检出源代码以后,就可以使用Visual Studio进行编译了。方法是打开platform/win32目录里面的mupdf.sln方案文件。

mupdf方案里面,有一个mupdfcpp项目,就是C++语言绑定。

但是,要编译mupdfcpp,需要额外的步骤,因为C++语言绑定的源代码是生成的。在编译mupdfcpp之前,需要先生成它的源文件。

方法是使用scripts/mupdfwrap.py脚本,而且这个脚本需要libclang库。

所以,可以在VS命令提示符里面完成这个过程:

pip install libclang setuptools
cd mupdf
python scripts/mupdfwrap.py -b m01

执行完成以后,会在Python的目录里生成一个mupdfcpp64.dll。把这个dll复制到自己的方案里面,或者放在全局的dll目录里面,就可以使用了。

使用

根据mupdf的语言绑定文档所言,mupdf的C++除了包装了C语言的API以外,还有一些额外的便利。

如,在C语言中使用mupdf的时候,大量的变量都是以fz_开头的,而C++使用了命名空间mupdf。即fz_document,对应mupdf::FzDocument,我们可以直接在源代码中使用

using namespace mupdf;

之后,直接使用驼峰命名的类名。

如,在C语言中使用mupdf的时候,需要先初始化一个fz_context,大量的函数都以这个fz_context为参数。而在C++中,这个上下文不是必须的,mupdf的C++绑定自动初始化了这个变量。

再比如,mupdf的C语言API,使用setjmp()实现了异常机制,我们在代码中需要使用

fz_try {}
fz_catch {}

代码块的方式,捕获这种异常。而mupdf的C++绑定,把这种异常与C++的异常机制结合了。

示例

下面写一个小函数,实现加载一个PDF文件,并且把指定的页面渲染成一张图片。

using namespace std;
using namespace mupdf;FzPixmap
loadPdfPage (const string &path, int page_number)
{auto doc = FzDocument (path.c_str ());auto page = doc.fz_load_page (page_number);// 取得页面大小auto rect = page.fz_bound_page ();auto width = rect.x1 - rect.x0;auto height = rect.y1 - rect.y0;cout << "pdf page " << page_number << " size: " << width << "," << height<< endl;// 设置缩放比例auto matrix = FzMatrix::fz_scale (1.0f, 1.0f);// 设置旋转角度matrix = fz_pre_rotate (matrix, 0.0f);auto pixmap = page.fz_new_pixmap_from_page (matrix, fz_device_rgb (), 0);return pixmap;
}

http://www.ppmy.cn/embedded/111514.html

相关文章

JavaScript如何制作轮播图

在JavaScript中实现轮播图可以通过多种方式&#xff0c;但最常见的方式是使用数组来存储图片&#xff0c;然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子&#xff1a; 首先&#xff0c;你需要在HTML中设置一些用于显示图片的<img>标签&#xff0c;以…

Java多态

多态 多态是建立在继承和封装的基础之上 多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个核心概念&#xff0c;它允许同一个接口被不同的底层形式&#xff08;数据类型&#xff09;使用。多态使得我们能够通过一个通用的接口来引…

django ubuntu 踩坑集锦

目录 1 ubantu mysql查看表结构2 导入同级目录文件出现未解析引用错误3 第三方包——tinymce富文本编辑器4 verbose_name,verbose_name_plural5 搜索路径的添加6 auto_now_add 和 auto_now7 auth_user的表结构8 在 Django 中定义 ForeignKey 字段时&#xff0c;必须指定 on_del…

『功能项目』管理器基类【38】

我们打开上一篇37单例模式框架的项目&#xff0c; 本章要做的事情是编写管理器基类 首先创建脚本&#xff1a;ManagerBase.cs using UnityEngine; public abstract class ManagerBase : MonoBehaviour{public virtual void Init() { } } public class ManagerBase<T> : …

MicroPython 片上psrom的支持,并将多个bin合成为一个bin

前两天在github上下载的MicroPython 版本1.20.0&#xff0c;怎么配置都无法开启片上psrom的支持&#xff0c;折腾了一周&#xff0c;都自我怀疑了&#xff0c;最后更新版本为1.23.0一编译直接就过了。。。下面记录下过的&#xff0c;过程&#xff0c;这边使用的是四线SPI的片上…

石墨纯化废酸回收处理

采用硫酸置换法进行低温蒸发并多级吸收得到高纯净酸液&#xff0c;饱和浓液低温结晶分离得到晶体和滤液。晶体物以硫酸盐为主&#xff0c;委外处理&#xff1b;滤液回再次用于混合废酸。 在石墨纯化过程中&#xff0c;采用硫酸置换法不仅有效处理了废酸&#xff0c;还通过精细的…

0基础转行AI产品经理,终于有人说清楚了!

当AI成为趋势&#xff01;越来越多的产品已经或正在高度AI化&#xff0c;这个趋势正如已经完成的产品移动化一样不可阻挡。产品经理要想让自己保值增值&#xff0c;必须积极拥抱AI的大趋势。 . 学习 AI 产品经理可以参考以下书籍&#xff1a; 《人工智能产品经理——AI时代P…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…