
图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载MuPDF 的 JavaScript 绑定提供了Buffer类用于高效处理二进制数据例如Pixmap.asJPEG()等图像导出接口产生的字节流。本文以 Buffer API 参考文档 为骨架结合 mupdf.js 的 TypeScript 实现、WASM C 胶水层与 mutool run 的 FFI 源码系统讲解 Buffer 的构造、读写、切片与持久化能力帮助你在 Node、浏览器和mutool run三种场景下正确驾驭字节缓冲区。两种运行环境下的 BufferMuPDF 的 JavaScript 绑定可以在两种环境中使用参见 JavaScript 绑定简介mutool runMuPDF 自带的脚本执行工具基于内置的 Mujs 引擎对应实现位于 source/tools/murun.cmupdf.js面向 Node 与浏览器的 npm 包WASM 绑定实现在 platform/wasm/lib/mupdf.ts 与 platform/wasm/lib/mupdf.c。两个环境的 API 高度一致仅有少量成员做了环境限定文档中以 only mutool run 或 only mupdf.js 标记标记定义见 docs/conf.py。Buffer 中受环境限定的成员包括成员可用环境buffer[n]索引读写仅 mutool runasUint8Array()仅 mupdf.jswriteRune(c)仅 mutool runBuffer 本质上是 MuPDF 核心类型fz_buffer的 JavaScript 包装mupdf.js 中Buffer extends Userdatafz_buffer见 platform/wasm/lib/mupdf.ts其 C 结构定义于 include/mupdf/fitz/buffer.h。它只存储原始字节因此比 JavaScript 普通数组高效得多。构造函数多种初始化数据源var buffer new mupdf.Buffer(hello world)构造函数接受以下类型之一null/省略表示创建空缓冲区参数类型行为null/ 缺省创建空 Bufferstring将字符串按 UTF-8 编码填入 BufferArrayBuffer/Uint8Array拷贝底层字节Buffer拷贝另一 Buffer 的内容mupdf.js 的构造逻辑platform/wasm/lib/mupdf.ts分三条路径无参数时调用_wasm_new_buffer(1024)对应 C 层fz_new_bufferplatform/wasm/lib/mupdf.c传入字符串时先用lengthBytesUTF8计算 UTF-8 长度再经stringToUTF8写入堆内存最后调用_wasm_new_buffer_from_dataC 层对应fz_new_buffer_from_data见 platform/wasm/lib/mupdf.c传入ArrayBuffer/Uint8Array时通过HEAPU8.set拷入 WASM 堆同样走_wasm_new_buffer_from_data。在 mutool run 中murun.c 的ffi_tonewbuffersource/tools/murun.c负责把 JS 值转成fz_buffer字符串会被fz_new_buffer_from_copied_data拷贝已有 userdata 直接 keep其他情况则新建空 buffer。实例属性length字节数只读var length buffer.length返回当前 Buffer 的字节数。该属性只读任何赋值操作都会抛出TypeError。mupdf.js 中 getter 委托getLength()setter 显式抛出TypeError(buffer length is read-only)platform/wasm/lib/mupdf.tsmutool run 的ffi_buffer_put同样在写入length时抛出js_typeerror(J, buffer length is read-only)source/tools/murun.c。buffer[n]索引读写仅 mutool runvar byte buffer[0]在mutool run中可用数组下标方式读取或写入指定位置的字节越界访问抛出RangeError。murun.c 的ffi_buffer_has通过fz_buffer_storage取数据指针后按下标返回data[idx]越界时报js_rangeerror(J, index out of bounds)source/tools/murun.c。mupdf.js 中请改用等价的readByte()/writeByte()。实例方法读取与转换asString()转为字符串var str buffer.asString()把 Buffer 内容整体解码为字符串返回。mupdf.js 中经 C 层fz_string_from_buffer实现platform/wasm/lib/mupdf.c。asUint8Array()转为字节数组仅 mupdf.jsvar arr buffer.asUint8Array()返回 Buffer 内容的Uint8Array视图。注意 mupdf.js 中该实现基于HEAPU8.subarray(data, data size)platform/wasm/lib/mupdf.ts是 WASM 堆上的共享视图而非拷贝解读时需注意生命周期。getLength()查询字节数var length buffer.getLength()与length属性等价的方法形式返回字节数底层调用_wasm_buffer_get_lenplatform/wasm/lib/mupdf.ts。readByte(at)读取单字节buffer.readByte(0)返回索引at处的字节有效范围为0 at getLength()越界时返回undefined而非抛异常。mupdf.js 中直接以HEAPU8[data at]返回platform/wasm/lib/mupdf.ts。slice(start, end)切片生成新 Buffervar buffer new mupdf.Buffer() buffer.write(hello world) // buffer contains hello world var newBuffer buffer.slice(1, -1) // newBuffer contains ello worl创建包含原 Buffer 数据子集的新 Bufferstart/end为相对开头的偏移量为负数时表示相对 Buffer 末尾如-1指最后一个字节之后若start已指向末尾或end指向start之前/相等位置则返回空 Bufferend可省略省略时默认取到末尾mupdf.js 中end this.getLength()见 platform/wasm/lib/mupdf.ts。底层由 C 层fz_slice_buffer完成platform/wasm/lib/mupdf.c。实例方法写入与追加write(str)追加 UTF-8 字符串buffer.write(hello world)将字符串按 UTF-8 编码追加到 Buffer 末尾C 层对应fz_append_stringplatform/wasm/lib/mupdf.c。writeBuffer(data)追加另一缓冲区buffer.writeBuffer(anotherBuffer)将data的内容追加到末尾。data支持Buffer | ArrayBuffer | Uint8Array | string四种类型。mupdf.js 内部定义了统一类型别名AnyBuffer并由BUFFER()帮助函数自动归一化为fz_buffer指针platform/wasm/lib/mupdf.ts随后调用_wasm_append_bufferC 层fz_append_buffer。writeByte(byte)追加单字节buffer.writeByte(0x2a)追加一个字节。只取数值的最低 8 位因此传入大于 255 的值会被截断。C 层为fz_append_byte。writeLine(str)追加一行文本buffer.writeLine(a line)追加字符串并在末尾补一个换行符\n字节值 10。mupdf.js 中其实现就是write(s)后接writeByte(10)platform/wasm/lib/mupdf.ts。writeRune(c)追加 Unicode 字符仅 mutool runbuffer.writeRune(0x4f60) // To append U4f60, 你 buffer.writeRune(0x597d) // To append U597d, 好 buffer.writeRune(0xff01) // To append Uff01, 将 Unicode 码点按 UTF-8 编码后追加到 Buffer 末尾。参数c是码点数值而非字符串适合在mutool run中逐字构建含多语言文本的字节流。实例方法保存到文件save(filename)写出文件buffer.save(buffer.dat)将 Buffer 内容写入指定文件。注意mupdf.js 中该方法依赖 Node 的fs模块node_fs.writeFileSync在纯浏览器环境会抛出missing fs moduleplatform/wasm/lib/mupdf.tsmutool run环境下则无此限制。典型实战构建与导出二进制内容Buffer 在 MuPDF 的 JavaScript API 中贯穿产出二进制 → 传递二进制 → 持久化的完整链路图像导出Pixmap.asPNG()、asJPEG(quality, cmyk_method)、asPSD()、asPAM()等方法的返回值正是文档开篇提到的二进制数据来源实现见 platform/wasm/lib/mupdf.tsPDF 文档往返PDFDocument.saveToBuffer()返回包含成品 PDF 字节的 Bufferplatform/wasm/lib/mupdf.tsDocument.openDocument()则接受Buffer | ArrayBuffer | Uint8Array | Stream | string作为输入platform/wasm/lib/mupdf.ts流式读写PDFObject.readStream()/readRawStream()返回新 BufferwriteStream(buf)/addStream(buf, obj)接受AnyBuffer。以下是一个覆盖主要 API 的完整示例mutool runvar buffer new mupdf.Buffer() buffer.write(hello world) // 追加 UTF-8 字符串 buffer.writeLine(a line) // 追加一行含换行 buffer.writeByte(0x2a) // 追加单字节 * buffer.writeRune(0x4f60) // 追加 你 var byte buffer[0] // 索引读取仅 mutool run var first buffer.slice(0, 5) // 切片hello var full buffer.asString() // 整体转为字符串 var n buffer.getLength() // 字节数 buffer.save(buffer.dat) // 写出文件mupdf.jsNode中的等价写法const mupdf require(mupdf) var buffer new mupdf.Buffer(hello world) var arr buffer.asUint8Array() // Uint8Array仅 mupdf.js var str buffer.asString() buffer.writeBuffer(new mupdf.Buffer(!)) buffer.writeByte(10) // 追加换行 var tail buffer.slice(1, -1) // 去掉首尾 buffer.save(buffer.dat) // 需要 Node fs 模块小结MuPDF JavaScript 的Buffer是对核心fz_buffer的薄封装读取侧提供asString()、asUint8Array()、getLength()、readByte()与slice()写入侧提供write()、writeBuffer()、writeByte()、writeLine()与writeRune()外加length只读属性和save()持久化。无论你是用mutool run写脚本还是在 mupdf.js 中处理图像/PDF 字节流掌握这些方法即可高效完成二进制数据的组装、切片、转换与落盘。赞分享图形学图像处理【免费下载链接】mupdfmupdf mirror项目地址https://gitcode.com/gh_mirrors/mu/mupdf点击查看免费下载相关推荐MuPDF JavaScript Archive 类完全指南在 mutool run 中读取 ZIP/TAR 与目录归档MuPDF JavaScript Archive 类完全指南在 mutool run 中读取 ZIP/TAR 与目录归档 本指南系统讲解 MuPDF 的 Ja图形学图像处理SumatraPDF 仓库内 MuPDF JavaScript Buffer API 完全指南二进制数据操作、构造与全部方法详解SumatraPDF 仓库内 MuPDF JavaScript Buffer API 完全指南二进制数据操作、构造与全部方法详解 导读 本文是围绕 MuPDF桌面应用文档在 JavaScript 与 TypeScript 中使用 MuPDFMuPDF.js 与 mutool run 完全指南在 JavaScript 与 TypeScript 中使用 MuPDFMuPDF.js 与 mutool run 完全指南 导读 MuPDF 是一个跨语言的桌面应用文档上一篇Feast 流式窗口聚合的 Tiling 算法与中间表示IR机制解析下一篇Radix Vue 的 ToggleGroupItem 组件深度解析Props、Slots 与源码实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考