为了账号安全,请及时绑定邮箱和手机立即绑定

来介绍下 MuPDF.js API 吧

MuPDF.js 实现在 Node.js 或浏览器环境中执行各种 PDF 操作

MuPDF.js 是由 Artifex Software 开发的轻量且高性能的 PDF、XPS 和电子书渲染引擎 MuPDF 提供的一个 JavaScript 接口。MuPDF.js 让开发人员能够将 MuPDF 的强大学术处理功能直接集成到基于 JavaScript 的 Web 应用程序中,从而能够在 Node.js 和/或浏览器环境中轻松处理诸如查看、渲染和处理文档等 PDF 操作。MuPDF.js 允许开发人员在 Node.js 和/或浏览器环境中轻松执行查看、渲染和处理等广泛的 PDF 操作。

MuPDF.js 的主要特点
  1. 文本提取: 可以从PDF文档中提取文本内容,这对于在PDF中搜索、索引和分析文本数据非常有用。
  2. 文档操作: MuPDF.js 提供了合并、拆分和操作PDF文档的功能,这对于需要处理文档工作流程的应用程序特别有用。
  3. 注释: MuPDF.js 支持读取和添加注释到PDF文档,例如高亮、评论和其他标注工具。
  4. 红化处理: MuPDF.js 支持向PDF文档添加红化处理,使其适用于需要隐藏某些数据(如个人信息、财务细节或机密信息)的敏感业务文档,以防止未经授权的查看者查看。
  5. 图像和图形渲染: 除了简单的文本和页面渲染,MuPDF.js 还支持高质量地渲染嵌入文档中的图像和矢量图形。
  6. 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 方法的更多信息,请参阅我们的文档

高级用法
合并PDF文档

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 的 NPM 包(npm 包)

“Node使用指南” MuPDF 文档

最后,请查阅MuPDF.js在Github——它包含许多示例,并且是提交问题报告、讨论想法或直接在我们的Discord上提问的地方https://discord.gg/zpyAHM7XtF

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消