工具链接
在线使用:https://kazutoiris.github.io/generate-searchable-pdf/
GitHub 源代码仓库:kazutoiris/generate-searchable-pdf,欢迎 Follow 和 Star!!!
部署在 GitHub Pages 上,全部使用前端实现,加载后可以断开互联网使用。受限于国际带宽,可能需要一定加载时间,欢迎提供国内镜像。
背景
制作双层PDF(也称为带有图层的PDF或复合PDF)是指在一个PDF文档中同时包含多个可独立显示或隐藏的图层,允许用户根据需要选择性地显示或隐藏特定内容,比如文本层、图像层或注释义。这对于制作教学材料、设计草图稿、工程图纸、交互式地图等非常有用。参加国网招投标,技术商务支持文件等都要制作成双层pdf格式!
目前,市面上的双层 PDF 制作工具大部分的原理都是基于 OCR,先将 PDF 转换为图像,然后对图像进行识别。
“但是,有了原文件为什么还需要 OCR?” 于是,就有了本工具。
分析
观察使用 Acrobat 生成的双层 PDF,可以看到,在原先的 PDF 文件中,图片下方多加了一层文字。
因此,在已有文字层的情况下,只需要添加一层图片到顶部就行。这样,就不再需要 OCR 了。
思路
MuPDF 允许开发者方便地处理 PDF 和其他文档格式。它提供了一组丰富的功能,使用户能够读取、编辑和操作文档。以下是 MuPDF 的一些主要特点:
-
易于使用:MuPDF 提供了简单易用的 API,使得处理 PDF 文档变得更加直观。
-
多格式支持:除了 PDF,PyMuPDF 还支持多种文档格式,如 XPS、CBZ、EPUB 等。
-
高效渲染:利用 MuPDF 的高性能渲染引擎,可以快速打开和显示大文件,保持良好的渲染质量。
-
文本提取:可以从 PDF 中提取文本、图像和其他对象,支持文本搜索和定位。
-
编辑功能:允许添加注释、图像、文本框等,用户可以修改和增强现有文档。
-
页面操作:提供对文档页面的操作功能,如旋转、缩放、合并和拆分页面。
尤其是目前 MuPDF 支持 WASM,使得在跨平台支持的情况下,具有很好的性能。
实现
首先,将 PDF 的每一页转换为图像。为了保证图像质量,这里以 4 倍超分的方式生成。
page.toPixmap(this.mupdf.Matrix.scale(2, 2), this.mupdf.ColorSpace.DeviceRGB);
然后,添加图像到原页面中,拉伸为页面大小,并置于页面顶层。
const extra_contents = doc.addStream(`q ${page.getBounds()[2] - page.getBounds()[0]} 0 0 ${page.getBounds()[3] - page.getBounds()[1]} ${page.getBounds()[0]} ${page.getBounds()[1]} cm /ImageContent Do Q`, null)
最后,导出 PDF 即可。
const buffer = doc.saveToBuffer("compress").asUint8Array();
因为没有使用 OCR 和 Acrobat,运行速度相当快。
后续
最近招标制作双层PDF文件,做成以后发现在公章附近的文字不可以复制,求解! 中可以看到,Acrobat 的识别效果并不好。使用本工具,只要原 PDF 可复制,生成的 PDF 就一定是可复制的,而且目录、结构都和原来一致!