Pyodide#

概述#

  • Pyodide 是一个在网络浏览器中运行的客户端 Python 实现。

  • PyMuPDF 的 Pyodide 构建目前处于实验阶段。

为 Pyodide 构建 PyMuPDF wheel#

通过运行 scripts/gh_release.py 并设置一些环境变量,可以构建一个适用于 Pyodide 的 PyMuPDF wheel。.github/workflows/test_pyodide.yml 会在 Github 上定期测试此过程。

以下是一个示例,这是一个单行 Linux 命令(需在 PyMuPDF 代码库的当前目录下运行),用于构建 Pyodide wheel

inputs_sdist=0 \
inputs_PYMUPDF_SETUP_MUPDF_BUILD="git:--recursive --depth 1 --shallow-submodules --branch master https://github.com/ArtifexSoftware/mupdf.git" \
inputs_wheels_default=0 \
inputs_wheels_linux_pyodide=1 \
./scripts/gh_release.py build

该命令执行以下操作(均在 Python 虚拟环境中进行)

  • 下载(git clone 并 pip install)并自定义 Pyodide 构建环境。

  • 下载(git clone)最新的 MuPDF。

  • 在 Pyodide 构建环境中构建 MuPDF 和 PyMuPDF。

  • dist/ 目录中创建一个 wheel。

更多信息,请参阅 scripts/gh_release.py 文件中函数 build_pyodide_wheel()pyodide_setup() 的注释。

使用 Pyodide wheel#

  • 将 wheel 文件(例如 PyMuPDF/dist/PyMuPDF-1.24.2-cp311-cp311-emscripten_3_1_32_wasm32.whl)上传到已配置允许跨域资源共享(Cross-origin resource sharing, https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)的 Web 服务器上。

  • 该 wheel 可用于在 Web 浏览器中运行的 Pyodide 控制台,或在 Web 浏览器中运行的 JupyterLite notebook。

  • 在这两种情况下,都可以使用以下代码下载 wheel(将 url 替换为上传的 wheel 文件的 URL)并导入它

    import pyodide_js
    await pyodide_js.loadPackage(url)
    import pymupdf
    
    • 请注意,micropip.install() 不起作用,因为 PyMuPDF 使用了共享库。

将 PDF 文档从 URL 加载到 PyMuPDF 中#

  • Pyodide 浏览器控制台没有通用的网络访问权限,因此例如 urllib.request.urlopen(url) 会失败。但 Pyodide 有一个内置的 pyodide.http 模块,它内部使用 javascript,您可以使用它将内容下载到 bytes 实例中,然后可以使用此实例创建 PyMuPDF 的 Document 实例

    import pyodide.http
    r = await pyodide.http.pyfetch('https://...')
    data = await r.bytes()
    doc = pymupdf.Document(stream=data)
    
  • 看来这只适用于 https://,而不适用于 http://


本软件按“原样”提供,不附带任何明示或暗示的保证。本软件按许可协议分发,除非该许可条款明确授权,否则不得复制、修改或分发。有关许可信息,请参阅 artifex.com,或联系 Artifex Software Inc., 39 Mesa Street, Suite 108A, San Francisco CA 94129, United States 获取更多信息。