前段时间一直在研究在浏览器中预览PDF文档并对其进行相关的操作。其中研究了PDF.js(详情请看我的PDF.js系列的文章);这里来研究使用MuPDF构建一个Web应用程序并编写自己的自定义UI。在页面中可以滚动浏览文档,它将在页面进入视图时呈现页面。也可以更改缩放级别,按照页面上和目录中的链接进行操作。
备注:这里不去讲解怎么搭建webassembly的相关环境,如果要搭建这个环境,请查看我的另外一篇博客:https://blog.csdn.net/as3luyuan123/article/details/121648379 。
MuPDF是一个轻量级的PDF,是一个PDF文档解析器。详情查看官网: https://mupdf.com/ 。
现在大多数项目都是使用ubuntu16进行开发,因此我的虚拟机系统由原先的ubuntu14升级成了ubuntu16。因此我现在的机器环境是:ubuntu 16-04 LTS版本。如下图所示:

Windows环境下怎么去编译mupdf的wasm版本,我测试了好几次,一直编译不成功。Makefile应该有对应的问题,建议在linux下进行编译调试。
首先进入https://www.mupdf.com/releases/进行对应的版本下载,我下载的是最新的版本mupdf-1.20.0-source.tar.lz:

解压出的源码结构如下:

通过查看Makerules文件,发现编译wasm版本很简单,直接通过一行命令解决问题:make OS=wasm。执行这个命令后有可能会遇到下面的问题:

通过查资料发现,是我的WebAssembly开发环境设置的初始化内存太小,应该设置大一些。直接修改emsdk/upstream/emscripten/src目录里面的settings.js,将值设置大一些,相关设置如下图所示:(备注:一定要设置成64KB的倍数,要不然会报
emcc: error: INITIAL_MEMORY must be a multiple of WebAssembly page size (64KiB)的错误)。
我只遇到了这一个错误,然后编译完成。编译完成后,可以在build/wasm/release目录下看到对应的编译后的文件列表,如下图所示:

前一章节编译的是对应的Wasm静态库,这一章节编译的是对应的demo。进入源码的platform/wasm目录,如下图所示:

在终端中输入./build.sh进行编译,有可能会报一下错误:如下图所示:

这是因为在build.sh文件中,默认指定的是去读/opt/emsdk/emsdk_env.sh的环境变量并进行设置,但在配置webassembly环境时,已经默认设置了对应的环境变量,这里把source /opt/emsdk/emsdk_env.sh删除即可编译成功。最终在当前目录下多一个libmupdf.wasm文件。编译后的结果如下图所示:

至此为止,所有的编译都完成了。
在当前面目录下,使用python3 -m http.server 8000 命令,启动即可在chrome浏览器中访问网址,进行测试。在chrome浏览器中输入: http://localhost:8000/即可进行访问使用命令启动的服务器。如下图所示:

点击 PDF Document链接,先会装载Wasm模块,然后有可能会提醒 Error: Could not fetch document. 的错误。会出现这个错误原因是:该目录下没有一个叫pdfref13.pdf的文件。在该目录下放入一个pdf文件并命名为pdfref13.pdf,即可打开文档。打开后的文档截图如下图所示:

用F12命令打开chrome的调试器,就能够清楚的看出调用的结构:该结构分为两部分:
1、作为一个异步库,在 Web Worker 线程中生成 MuPDF,并提供用于加载 PDF 文件、获取目录以及将页面呈现为 PNG 图像以准备插入 DOM 的功能。
2、是执行异步库的基本 HTML 应用程序,由js写的,用于展示pdf文档。
