首页 > 其他分享 >mupdf webassembly 试用

mupdf webassembly 试用

时间:2023-11-27 20:25:08浏览次数:42  
标签:mupdf ENABLE webassembly DFZ wasm 试用 MUPDF pdf

mupdf 是基于c++编写的pdf 读写以及预览工具,同时也提供了sdk,官方基于emscripten 开发了一个
webassembly的扩展

参考使用

 
const fs = require("fs")
const mupdf = require("mupdf")
let data = fs.readFileSync("demo.pdf")
let doc = mupdf.Document.openDocument(data, "application/pdf")
console.log(doc.countPages())
let page = doc.loadPage(0);
var sText = page.toStructuredText();
const myinfo =  sText.asJSON()
console.log(myinfo)

wasm 生成简单说明

  • 项目结构

mupdf.c 为需要暴露的c 服务,mupdf.js 是基于wasm 实现的方便pdf 操作的工具方法(支持web 以及node 运行)

  • 文档打开
    调用了的暴露的webassembly 方法
 
static openDocument(from, magic) {
    checkType(magic, "string")
 
    let pointer = 0
 
    if (from instanceof ArrayBuffer || from instanceof Uint8Array)
        from = new Buffer(from)
    if (from instanceof Buffer)
       //
        pointer = libmupdf._wasm_open_document_with_buffer(STRING(magic), from)
    else if (from instanceof Stream)
        pointer = libmupdf._wasm_open_document_with_stream(STRING(magic), from)
    else
        throw new Error("not a Buffer or Stream")
 
    let pdf_ptr = libmupdf._wasm_pdf_document_from_fz_document(pointer)
    if (pdf_ptr)
        return new PDFDocument(pointer)
    return new Document(pointer)
}

c 实现

// --- Document ---
 
EXPORT
fz_document * wasm_open_document_with_buffer(char *magic, fz_buffer *buffer)
{
    POINTER(fz_open_document_with_buffer, magic, buffer)
}
  • 构建
    基于了emscripten 同时包含了不少参数
 
#!/bin/bash
 
MUPDF_DIR=../..
EMSDK_DIR=/opt/emsdk
 
MUPDF_OPTS="-Os -DTOFU -DTOFU_CJK -DFZ_ENABLE_XPS=0 -DFZ_ENABLE_SVG=0 -DFZ_ENABLE_CBZ=0 -DFZ_ENABLE_IMG=0 -DFZ_ENABLE_HTML=0 -DFZ_ENABLE_EPUB=0 -DFZ_ENABLE_JS=0 -DFZ_ENABLE_OCR_OUTPUT=0 -DFZ_ENABLE_DOCX_OUTPUT=0 -DFZ_ENABLE_ODT_OUTPUT=0"
 
export EMSDK_QUIET=1
source $EMSDK_DIR/emsdk_env.sh
echo
 
echo BUILDING MUPDF CORE
make -j4 -C $MUPDF_DIR build=release OS=wasm XCFLAGS="$MUPDF_OPTS" libs
echo
 
echo BUILDING MUPDF WASM
emcc -o lib/mupdf-wasm.js -I $MUPDF_DIR/include lib/mupdf.c \
    --no-entry \
    -sABORTING_MALLOC=0 \
    -sALLOW_MEMORY_GROWTH=1 \
    -sMODULARIZE=1 \
    -sNODEJS_CATCH_EXIT=0 \
    -sWASM_ASYNC_COMPILATION=0 \
    -sEXPORT_NAME='"libmupdf"' \
    -sEXPORTED_RUNTIME_METHODS='["ccall","UTF8ToString","lengthBytesUTF8","stringToUTF8"]' \
     $MUPDF_DIR/build/wasm/release/libmupdf.a \
     $MUPDF_DIR/build/wasm/release/libmupdf-third.a
echo

说明

mupdf 对于webassembly 的支持实现上是很值得学习的,属于一个比较完整的emscripten集成项目

参考资料

https://github.com/ArtifexSoftware/mupdf
https://mupdf.readthedocs.io/en/latest/quick-start-guide.html
https://mupdf.readthedocs.io/en/latest/mupdf-wasm.html
https://github.com/ArtifexSoftware/mupdf/blob/master/platform/wasm/lib/mupdf.js
https://github.com/ArtifexSoftware/mupdf/blob/master/platform/wasm/lib/mupdf.c
https://mupdf.com/wasm/demo/view.html?file=../../docs/mupdf_explored.pdf#page2
https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#interacting-with-code-ccall-cwrap

标签:mupdf,ENABLE,webassembly,DFZ,wasm,试用,MUPDF,pdf
From: https://www.cnblogs.com/rongfengliang/p/17860338.html

相关文章

  • 2023-11-27 记录react拖拽组件——react-draggable试用方法
    安装:yarnaddreact-draggable注:如果你用npm安装失败可以尝试使用yarm,我就是npmi react-draggable报错了,用yarn装才好普通使用://引入importDraggablefrom'react-draggable';constDraggableCore:any=Draggable;//使用<div><DraggableCore><div>666&l......
  • 4款优质国产办公软件,支持内网环境使用,可免费试用
    在现代社会中,办公软件已成为企业必不可少的工具之一。与此同时,随着信息安全和数据保护意识的提升,越来越多的企业开始关注是否有适用于内网环境的国产办公软件。今天给大家分享4款优质国产办公软件,它们不仅支持内网环境使用,还可免费试用,帮助企业提高办公效率。01、小鱼易连(视频会议......
  • lunatic Erlang 启发的webassembly runtime
    lunatic属于一个webassembly的runtime,提供了隔离,轻量的进程架构模式,可以方便的创建分布式集群(类似erlang提供的集群能力)包含的特性开源 apache以及MIT许可协议高性能 提供了jit编译的wasm安全 核心是wasm的能力容错 提供了类似erlang的supervisiontree能力......
  • Spin 基于rust 开发的开源运行基于webassembly serverless 工具
    spin是基于rust开发的,可以用来开发以及运行基于webassemblyserverless服务的工具包含的特性提供了周边扩展 默认wasm只提供了基本类型的支持,wasm提供了不少扩展可以方便的支持不同语言的调用(比如网络,数据库访问)提供了快速应该开发的cli提供了服务部署的能力 包含了本......
  • wasmer 基于webassembly 的平台
    wasmer基于webassembly的平台,目前包含了runtime,registry,edge等组件说明wasmer属于一个插件化的设计,目前支持wasix,wasi以及Emscripten,同时还提供了不少语言sdk方便代码嵌入同时wasmer也提供了就很不错的性能,很值得学习试用下参考资料https://docs.wasmer.io/https://do......
  • 龙芯发布 .NET 8 SDK 8.0.100-ea1(试用版)
    随着.NET8的发布,国内的社区朋友们也很关心龙芯.NET团队对于Loongarch.NET8的发布时间,目前从龙芯.NET编译器团队已经在龙芯.NET官网上发布龙芯.NET8SDK-8.0.100-ea1版本发布(试用版),从龙芯2019年启动.NET的研发工作,2022年完成了LoongArch64架构代码合并到.NET社区主干分......
  • 一些方便的webassembly 工具
    WebAssembly团队提供了一些方便的webassembly工具集包含的工具集wat2wasm 将WebAssembly文本格式(.wat)转换为WebAssembly二进制格式(.wasm)wasm2wat 是wat2wasm的反向工具,将二进制格式转换回文本格式(.wat)wasm-objdump 类似于传统的objdump工具,它打印有关WebAssembly二进制......
  • 一文了解导入测试数据自动化生成测试用例的方法
    概述  在模型开发过程中,测试是一个不可或缺的环节。在测试过程中,测试用例的编写是所有测试工程师关注的重点和难点。在编写的过程中,可能会遇到各种各样的问题,比如历史测试用例的复用,比如在MiL阶段回放HiL阶段的测试数据来debug,又如需要通过Excel实现测试用例的存储等等。上述......
  • 糟糕!试用期被裁了
    如果你觉得找工作已经够难了?那么抱歉,接下来我说的这件事情可能更令你更糟心。什么事情呢?如题所见,就是“试用期被裁这件事”。每年都会有同学找到我,说自己被裁了,比如下面这些。同程旅行被裁:一家知名外企被裁:其他类似的同学还有很多,比如B站试用期被裁、小红书被裁、得物......
  • 为什么要写测试用例,测试用例写给谁看?
    “为什么要编写测试用例,测试用例写给谁看”,这个问题看似简单,但却涵盖了一系列复杂的考虑因素,并不太好回答。为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”,我将通过以下5个方面进行展开:1、为什么要写测试用例?2、测试用例写给谁看?3、测试用例使用案例分......