来介绍下 MuPDF.js API 吧
MuPDF.js 是由 Artifex Software 开发的轻量且高性能的 PDF、XPS 和电子书渲染引擎 MuPDF 提供的一个 JavaScript 接口。MuPDF.js 让开发人员能够将 MuPDF 的强大学术处理功能直接集成到基于 JavaScript 的 Web 应用程序中,从而能够在 Node.js 和/或浏览器环境中轻松处理诸如查看、渲染和处理文档等 PDF 操作。MuPDF.js 允许开发人员在 Node.js 和/或浏览器环境中轻松执行查看、渲染和处理等广泛的 PDF 操作。
MuPDF.js 的主要特点- 文本提取: 可以从PDF文档中提取文本内容,这对于在PDF中搜索、索引和分析文本数据非常有用。
- 文档操作: MuPDF.js 提供了合并、拆分和操作PDF文档的功能,这对于需要处理文档工作流程的应用程序特别有用。
- 注释: MuPDF.js 支持读取和添加注释到PDF文档,例如高亮、评论和其他标注工具。
- 红化处理: MuPDF.js 支持向PDF文档添加红化处理,使其适用于需要隐藏某些数据(如个人信息、财务细节或机密信息)的敏感业务文档,以防止未经授权的查看者查看。
- 图像和图形渲染: 除了简单的文本和页面渲染,MuPDF.js 还支持高质量地渲染嵌入文档中的图像和矢量图形。
- PDF渲染: MuPDF.js 允许您使用 HTML5 Canvas 直接在浏览器中渲染PDF页面,使其可以在不使用任何外部插件的情况下轻松显示PDF内容于网页应用中。
接下来我们将通过一些基础和高级的操作示例来进一步探索。我们将假设所有的示例都在后端服务器上使用Node.js。
基本用法:(注:此处添加冒号或破折号以保持列表结构,符合英文格式"# Basic Use Cases")
加载文档让我们来试试我们的 MuPDF.js 库。把一个 PDF 文件复制到你正在使用的文件夹里,并确保能打开它。在 node 会话中试试:
首先,我们通过导入mupdf
库来加载MuPDF库,然后使用fs
模块读取名为test.pdf
的文件,并将其作为PDF格式传递给MuPDF文档对象。最后,我们打印出文档对象的信息。
你应该会在控制台看到类似 [PDFDocument #idNumber]
的输出信息,这表明 Javascript 运行时可以看到 MuPDF.js 刚刚加载并返回的那个 PDF 文档对象。
为了从文档中提取文本,我们只需调用MuPDF.js的toStructuredText
API即可。因为文本是按页提取的,如果我们想提取文档中所有页面的文本,就需要遍历每一页并提取所需数据。
例如:
let i = 0
while (i < document.countPages()) {
// 获取第 i 页的内容
const page = document.loadPage(i)
// 将页面内容转换为结构化的文本,并保留空白字符,然后转换为 JSON 格式
const json = page.toStructuredText("preserve-whitespace").asJSON()
// 输出 json 数据
console.log(`json=${json}`)
i++
}
这将返回一些结构化的对象,里面包含边界框、字体、其他元数据和文本值。
将PDF页面渲染为图像:要将一页转换为图像,请使用 toPixmap
方法,然后可以将Pixmap数据转换为你所需的图像格式。以下脚本会获取文档的第一页并将其转换为图像数据。
const page = document.loadPage(0) // 索引从0开始
let pixmap = page.toPixmap(mupdf.Matrix.scale(1,1), mupdf.ColorSpace.DeviceRGB, false, true) // 将缩放比例设置为1,保持原图大小不变,使用设备RGB颜色空间
let pngImage = pixmap.asPNG()
let base64Image = Buffer.from(pngImage, 'binary').toString('base64') // 将PNG图像转换为Base64编码的字符串
API 允许通过一个矩阵来定义分辨率 — 您可以调整矩阵参数来提高分辨率。您还可以选择背景是否透明,或者是否在过程中包含页面注释 — 有关 toPixmap
方法的更多信息,请参阅我们的文档。
MuPDF.js 可以复制文档页面内容并将其粘贴到新文档中,从而合并文档。
要将一个 PDF 文件与另一个 PDF 文件合并,我们需要使用 GraftObject
方法并复制从输入文档中复制所有页面及其内容至新文档中的新页。最后将新生成的文档保存到文件系统中。
例如,比如说,我们可以创建一个名为“pdf-merge.mjs”的文件,如下:
import * as fs from "fs"
import * as mupdf from "mupdf"
const scriptArgs = process.argv.slice(2)
function copyPage(dstDoc, srcDoc, pageNumber, dstFromSrc) {
var srcPage = srcDoc.findPage(pageNumber)
var dstPage = dstDoc.newDictionary()
dstPage.put("Type", dstDoc.newName("Page"))
if (srcPage.get("MediaBox"))
dstPage.put("MediaBox", dstFromSrc.graftObject(srcPage.get("MediaBox")))
if (srcPage.get("Rotate"))
dstPage.put("Rotate", dstFromSrc.graftObject(srcPage.get("Rotate")))
if (srcPage.get("Resources"))
dstPage.put("Resources", dstFromSrc.graftObject(srcPage.get("Resources")))
if (srcPage.get("Contents"))
dstPage.put("Contents", dstFromSrc.graftObject(srcPage.get("Contents")))
dstDoc.insertPage(-1, dstDoc.addObject(dstPage))
}
function copyAllPages(dstDoc, srcDoc) {
var dstFromSrc = dstDoc.newGraftMap()
for (var k = 0; k < srcDoc.countPages(); ++k)
copyPage(dstDoc, srcDoc, k, dstFromSrc)
}
function merge() {
var dstDoc = new mupdf.PDFDocument() // 创建一个新的PDF文档对象
for (var i = 1; i < scriptArgs.length; ++i) {
console.log("打开", scriptArgs[i])
var srcBuf = fs.readFileSync(scriptArgs[i])
var srcDoc = new mupdf.PDFDocument(srcBuf)
copyAllPages(dstDoc, srcDoc)
}
console.log("保存", scriptArgs[0])
var dstBuf = dstDoc.saveToBuffer("compress")
fs.writeFileSync(scriptArgs[0], dstBuf.asUint8Array())
}
if (scriptArgs.length < 2)
console.error("参数不足:node pdf-merge.mjs 输出.pdf 输入1.pdf 输入2.pdf …")
else
merge()
然后使用Node.js运行此脚本,将名为“input1.pdf”和“input2.pdf”的两个文档合并成一个名为“output.pdf”的新文件,如下所示:
node pdf-merge.mjs output.pdf input1.pdf input2.pdf
生成的“output.pdf”会代表这些合并文件。
给PDF添加标注MuPDF.js 提供了多种注解类型,添加这些注解到页面中涉及到创建注解,设置其内容、外观以及边界框。例如:
let annotation = page.createAnnotation("FreeText");
annotation.setContents("Hello World");
annotation.setDefaultAppearance("Helv", 16, [0,0,0]);
annotation.setRect([0,0,100,100]);
注释还涵盖了适用于处理文档中机密信息的红化方法。
编辑PDF页面MuPDF.js 可以让用户剪裁或翻转文档页面。
为了裁剪页面,我们需要通过 setPageBox
方法来设置页面框的“CropBox”属性,如下所述:
page.setPageBox("CropBox", [ 0, 0, 500, 500 ])
这段代码设置了页面的裁剪框,尺寸为500x500。
这里需要注意的是,MuPDF 的坐标系是从左上角开始测量的。
请参见MuPDF 坐标系统,了解更多详情。
将这编写成一个实用的脚本,我们称它为“pdf-crop.mjs”,如下所示。
import * as fs from "fs"
import * as mupdf from "mupdf"
const scriptArgs = process.argv.slice(2)
function crop() {
let document = mupdf.Document.openDocument(fs.readFileSync(scriptArgs[1]), "application/pdf")
const page = document.loadPage(0)
const x1 = scriptArgs[2]
const y1 = scriptArgs[3]
const x2 = scriptArgs[4]
const y2 = scriptArgs[5]
page.setPageBox("CropBox", [ x1, y1, x2, y2 ])
fs.writeFileSync(scriptArgs[0], document.saveToBuffer("incremental").asUint8Array())
}
if (scriptArgs.length < 6)
console.error("用法:node pdf-crop.mjs 输出文件.pdf 输入文件.pdf 左上X 坐标 左上Y 坐标 右下X 坐标 右下Y 坐标")
else
crop()
最后,
(此处可根据后续内容决定是否添加标点符号或直接接续文本)
我们刚刚概述了MuPDF.js的一些基本和高级操作,并通过代码样例来帮助理解API。敬请期待未来即将推出的更简洁的API封装,这将使使用MuPDF.js更简单、更可靠。
资源列表最后,请查阅MuPDF.js在Github——它包含许多示例,并且是提交问题报告、讨论想法或直接在我们的Discord上提问的地方https://discord.gg/zpyAHM7XtF。
共同学习,写下你的评论
评论加载中...
作者其他优质文章