命令行界面#

  • 1.16.8 版本新增

PyMuPDF 也可以通过命令行用于执行实用功能。此功能应能替代编写一些最基础的脚本。

诚然,与 MuPDF CLI 工具 mutool 在功能上存在一些重叠。另一方面,MuPDF 已不再支持 PDF 嵌入文件,因此 PyMuPDF 在这方面提供了独特的功能。

调用#

命令行界面可以通过两种方式调用。

  • 使用已安装的 pymupdf 命令

    pymupdf <command and parameters>
    
  • 或使用 Python 的 -m 开关调用 PyMuPDF 的 pymupdf 模块

    python -m pymupdf <command and parameters>
    

一般说明

  • 通过 "-h" 获取帮助,或通过 "command -h" 获取特定命令的帮助。

  • 参数可以在不引起歧义的情况下缩写。

  • 几个命令支持 -pages-xrefs 参数。它们用于向下选择。请注意:

    • 此实用工具的页面编号必须从 1 开始

    • 有效的 xref 编号从 1 开始。

    • 指定一个逗号分隔的列表,包含单个整数或整数范围。范围是由一个连字符 “-” 分隔的一对整数。整数不得超过最大页面或 xref 编号。要指定最大值,可以使用符号变量 “N”。整数或范围可以多次出现,顺序任意且可以重叠。如果在范围中第一个数字大于第二个数字,则相应的项目将按相反顺序处理。

  • 如何在脚本中使用此模块

    >>> import pymupdf.__main__
    >>> cmd = "clean input.pdf output.pdf -pages 1,N".split()  # prepare command line
    >>> saved_parms = sys.argv[1:]  # save original command line
    >>> sys.argv[1:] = cmd  # store new command line
    >>> pymupdf.__main__.()  # execute module
    >>> sys.argv[1:] = saved_parms  # restore original command line
    
  • 使用以下两行代码,并使用 Nuitka 在独立模式下编译。这将生成一个包含模块所有功能的 CLI 可执行文件,可在所有兼容平台上使用,无需安装 Python、PyMuPDF 或 MuPDF。

from pymupdf.__main__ import main
main()

清理和复制#

此命令将优化 PDF 并将结果存储在新文件中。您也可以使用它进行加密、解密和创建子文档。它与 MuPDF 命令行实用工具 “mutool clean” 大致相似。

pymupdf clean -h
usage: pymupdf clean [-h] [-password PASSWORD]
                [-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}]
                [-owner OWNER] [-user USER] [-garbage {0,1,2,3,4}]
                [-compress] [-ascii] [-linear] [-permission PERMISSION]
                [-sanitize] [-pretty] [-pages PAGES]
                input output

-------------- optimize PDF or create sub-PDF if pages given --------------

positional arguments:
input                 PDF filename
output                output PDF filename

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password
-encryption {keep,none,rc4-40,rc4-128,aes-128,aes-256}
                      encryption method
-owner OWNER          owner password
-user USER            user password
-garbage {0,1,2,3,4}  garbage collection level
-compress             compress (deflate) output
-ascii                ASCII encode binary data
-linear               format for fast web display
-permission PERMISSION
                      integer with permission levels
-sanitize             sanitize / clean contents
-pretty               prettify PDF structure
-pages PAGES          output selected pages, format: 1,5-7,50-N

如果指定 “-pages”,请注意仅复制与页面相关的对象,而不复制文档级项目,例如嵌入文件。

请查阅 Document.save() 了解参数含义。

提取字体和图像#

从选定的 PDF 页面提取字体或图像到指定目录

pymupdf extract -h
usage: pymupdf extract [-h] [-images] [-fonts] [-output OUTPUT] [-password PASSWORD]
                    [-pages PAGES]
                    input

--------------------- extract images and fonts to disk --------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-images               extract images
-fonts                extract fonts
-output OUTPUT        output directory, defaults to current
-password PASSWORD    password
-pages PAGES          only consider these pages, format: 1,5-7,50-N

图像文件名根据以下命名方案构建:“img-xref.ext”,其中“ext”是与图像关联的扩展名,“xref”是图像 PDF 对象的 xref

字体文件名由字体名称和关联的扩展名组成。字体名称中的任何空格都将替换为连字符“-”。

输出目录必须已存在。

注意

除了输出目录的创建外,此功能在功能上与 此脚本 等效并取代了它。

合并 PDF 文档#

要合并多个 PDF 文件,请指定

pymupdf join -h
usage: pymupdf join [-h] -output OUTPUT [input [input ...]]

---------------------------- join PDF documents ---------------------------

positional arguments:
input           input filenames

optional arguments:
-h, --help      show this help message and exit
-output OUTPUT  output filename

specify each input as 'filename[,password[,pages]]'

注意

  1. 每个输入必须按“filename,password,pages”格式输入。密码和页面是可选的。

  2. 如果使用了“pages”项,则密码项是必需的。如果 PDF 不需要密码,请指定两个逗号。

  3. “pages”格式与本节开头说明的格式相同。

  4. 每个输入文件在使用后会立即关闭。因此,您可以使用其中一个作为输出文件名,从而覆盖它。

示例:要合并以下文件

  1. file1.pdf: 所有页面,从后往前,无密码

  2. file2.pdf: 最后一页,第一页,密码:“secret”

  3. file3.pdf: 第 5 页到最后一页,无密码

并将结果存储为 output.pdf,输入此命令

pymupdf join -o output.pdf file1.pdf,,N-1 file2.pdf,secret,N,1 file3.pdf,,5-N

底层信息#

显示 PDF 内部信息。同样,与 “mutool show” 有相似之处。

pymupdf show -h
usage: pymupdf show [-h] [-password PASSWORD] [-catalog] [-trailer] [-metadata]
                [-xrefs XREFS] [-pages PAGES]
                input

------------------------- display PDF information -------------------------

positional arguments:
input               PDF filename

optional arguments:
-h, --help          show this help message and exit
-password PASSWORD  password
-catalog            show PDF catalog
-trailer            show PDF trailer
-metadata           show PDF metadata
-xrefs XREFS        show selected objects, format: 1,5-7,N
-pages PAGES        show selected pages, format: 1,5-7,50-N

示例

pymupdf show x.pdf
PDF is password protected

pymupdf show x.pdf -pass hugo
authentication unsuccessful

pymupdf show x.pdf -pass jorjmckie
authenticated as owner
file 'x.pdf', pages: 1, objects: 19, 58 MB, PDF 1.4, encryption: Standard V5 R6 256-bit AES
Document contains 15 embedded files.

pymupdf show FDA-1572_508_R6_FINAL.pdf -tr -m
'FDA-1572_508_R6_FINAL.pdf', pages: 2, objects: 1645, 1.4 MB, PDF 1.6, encryption: Standard V4 R4 128-bit AES
document contains 740 root form fields and is signed

------------------------------- PDF metadata ------------------------------
       format: PDF 1.6
        title: FORM FDA 1572
       author: PSC Publishing Services
      subject: Statement of Investigator
     keywords: None
      creator: PScript5.dll Version 5.2.2
     producer: Acrobat Distiller 9.0.0 (Windows)
 creationDate: D:20130522104413-04'00'
      modDate: D:20190718154905-07'00'
   encryption: Standard V4 R4 128-bit AES

------------------------------- PDF trailer -------------------------------
<<
/DecodeParms <<
    /Columns 5
    /Predictor 12
>>
/Encrypt 1389 0 R
/Filter /FlateDecode
/ID [ <9252E9E39183F2A0B0C51BE557B8A8FC> <85227BE9B84B724E8F678E1529BA8351> ]
/Index [ 1388 258 ]
/Info 1387 0 R
/Length 253
/Prev 1510559
/Root 1390 0 R
/Size 1646
/Type /XRef
/W [ 1 3 1 ]
>>

嵌入文件命令#

以下命令处理嵌入文件——这是 MuPDF 在 v1.14 后完全移除的功能,因此也从其所有命令行工具中移除。

信息#

显示嵌入文件名称(长格式或短格式)

pymupdf embed-info -h
usage: pymupdf embed-info [-h] [-name NAME] [-detail] [-password PASSWORD] input

--------------------------- list embedded files ---------------------------

positional arguments:
input               PDF filename

optional arguments:
-h, --help          show this help message and exit
-name NAME          if given, report only this one
-detail             show detail information
-password PASSWORD  password

示例

pymupdf embed-info some.pdf
'some.pdf' contains the following 15 embedded files.

20110813_180956_0002.jpg
20110813_181009_0003.jpg
20110813_181012_0004.jpg
20110813_181131_0005.jpg
20110813_181144_0006.jpg
20110813_181306_0007.jpg
20110813_181307_0008.jpg
20110813_181314_0009.jpg
20110813_181315_0010.jpg
20110813_181324_0011.jpg
20110813_181339_0012.jpg
20110813_181913_0013.jpg
insta-20110813_180944_0001.jpg
markiert-20110813_180944_0001.jpg
neue.datei

每条目的详细输出如下所示

     name: neue.datei
 filename: text-tester.pdf
ufilename: text-tester.pdf
     desc: nur zum Testen!
     size: 4639
   length: 1566

提取#

像这样提取一个嵌入文件

pymupdf embed-extract -h
usage: pymupdf embed-extract [-h] -name NAME [-password PASSWORD] [-output OUTPUT]
                        input

---------------------- extract embedded file to disk ----------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-name NAME            name of entry
-password PASSWORD    password
-output OUTPUT        output filename, default is stored name

有关详细信息,请查阅 Document.embfile_get()。示例(参见上一节)

pymupdf embed-extract some.pdf -name neue.datei
Saved entry 'neue.datei' as 'text-tester.pdf'

删除#

像这样删除一个嵌入文件

pymupdf embed-del -h
usage: pymupdf embed-del [-h] [-password PASSWORD] [-output OUTPUT] -name NAME input

--------------------------- delete embedded file --------------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password
-output OUTPUT        output PDF filename, incremental save if none
-name NAME            name of entry to delete

有关详细信息,请查阅 Document.embfile_del()

插入#

使用此命令添加新的嵌入文件

pymupdf embed-add -h
usage: pymupdf embed-add [-h] [-password PASSWORD] [-output OUTPUT] -name NAME -path
                    PATH [-desc DESC]
                    input

---------------------------- add embedded file ----------------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password
-output OUTPUT        output PDF filename, incremental save if none
-name NAME            name of new entry
-path PATH            path to data for new entry
-desc DESC            description of new entry

“NAME” 在 PDF 中不得已存在。有关详细信息,请查阅 Document.embfile_add()

更新#

使用此命令更新现有嵌入文件

pymupdf embed-upd -h
usage: pymupdf embed-upd [-h] -name NAME [-password PASSWORD] [-output OUTPUT]
                    [-path PATH] [-filename FILENAME] [-ufilename UFILENAME]
                    [-desc DESC]
                    input

--------------------------- update embedded file --------------------------

positional arguments:
input                 PDF filename

optional arguments:
-h, --help            show this help message and exit
-name NAME            name of entry
-password PASSWORD    password
-output OUTPUT        Output PDF filename, incremental save if none
-path PATH            path to new data for entry
-filename FILENAME    new filename to store in entry
-ufilename UFILENAME  new unicode filename to store in entry
-desc DESC            new description to store in entry

except '-name' all parameters are optional

使用此方法更改文件的元信息——只需省略“PATH”。有关详细信息,请查阅 Document.embfile_upd()

复制#

在 PDF 之间复制嵌入文件

pymupdf embed-copy -h
usage: pymupdf embed-copy [-h] [-password PASSWORD] [-output OUTPUT] -source
                    SOURCE [-pwdsource PWDSOURCE]
                    [-name [NAME [NAME ...]]]
                    input

--------------------- copy embedded files between PDFs --------------------

positional arguments:
input                 PDF to receive embedded files

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password of input
-output OUTPUT        output PDF, incremental save to 'input' if omitted
-source SOURCE        copy embedded files from here
-pwdsource PWDSOURCE  password of 'source' PDF
-name [NAME [NAME ...]]
                      restrict copy to these entries

文本提取#

  • v1.18.16 版本新增

从任意支持的文档中提取文本到文本文件。目前有三种输出格式模式可用:simple(简单)、block sorting(块排序)和 reproduction of physical layout(物理布局再现)。

  • Simple(简单)文本提取按文本在文档页面中出现的顺序再现所有文本——不做任何特定阅读顺序的重新排列。

  • Block sorting(块排序)按垂直坐标升序然后水平坐标升序对文本块(由 MuPDF 识别)进行排序。这对于建立基本文本页面的“自然”阅读顺序应该足够了。

  • Layout(布局)模式努力再现输入页面的原始外观。您可以预期得到这样的结果(由命令 pymupdf gettext -pages 1 demo1.pdf 生成)

_images/img-layout-text.jpg

注意

“gettext” 命令提供与 XPDF 软件的 CLI 工具 pdftotext 类似的功能,http://www.foolabs.com/xpdf/——尤其适用于“layout”模式,该模式结合了该工具的 -layout-table 选项。

在输出文件的每一页之后,会写入一个换页符,hex(12)——即使输入页面根本没有文本。此行为可以通过选项控制。

注意

对于“layout”模式,仅支持水平、从左到右、从上到下的文本,其他文本将被忽略。在此模式下,如果文本的 fontsize 过小,也会被忽略。

相比之下,“Simple”和“blocks”模式会输出所有文本,无论文本大小或方向如何。

命令

pymupdf gettext -h
usage: pymupdf gettext [-h] [-password PASSWORD] [-mode {simple,blocks,layout}] [-pages PAGES] [-noligatures]
                    [-convert-white] [-extra-spaces] [-noformfeed] [-skip-empty] [-output OUTPUT] [-grid GRID]
                    [-fontsize FONTSIZE]
                    input

----------------- extract text in various formatting modes ----------------

positional arguments:
input                 input document filename

optional arguments:
-h, --help            show this help message and exit
-password PASSWORD    password for input document
-mode {simple,blocks,layout}
                        mode: simple, block sort, or layout (default)
-pages PAGES          select pages, format: 1,5-7,50-N
-noligatures          expand ligature characters (default False)
-convert-white        convert whitespace characters to space (default False)
-extra-spaces         fill gaps with spaces (default False)
-noformfeed           write linefeeds, no formfeeds (default False)
-skip-empty           suppress pages with no text (default False)
-output OUTPUT        store text in this file (default inputfilename.txt)
-grid GRID            merge lines if closer than this (default 2)
-fontsize FONTSIZE    only include text with a larger :data:`fontsize` (default 3)

注意

只要不引起歧义,命令选项可以缩写。因此,以下两者效果相同:

  • ... -output text.txt -noligatures -noformfeed -convert-white -grid 3 -extra-spaces ...

  • ... -o text.txt -nol -nof -c -g 3 -e ...

输出文件名默认为输入文件,其扩展名替换为 .txt。与其他命令一样,您可以按照上述说明,以 mutool 格式选择页面范围(注意:基于 1 开始!)

  • mode: (str) 选择格式模式 – 默认是“layout”。

  • noligatures: (bool) 对应于不使用 TEXT_PRESERVE_LIGATURES。如果指定,连字(高级字体中存在:组合多个字符的字形,如“fi”)将被拆分成其组成部分(即“f”、“i”)。默认是直接通过。

  • convert-white: 对应于不使用 TEXT_PRESERVE_WHITESPACE。如果指定,所有空白字符(如制表符)将被替换为一个或多个空格。默认是直接通过。

  • extra-spaces: (bool) 对应于不使用 TEXT_INHIBIT_SPACES。如果指定,相邻字符之间的大间隔将填充一个或多个空格。默认是关闭。

  • noformfeed: (bool) 在输出页面末尾写入换行符 \n,而不是 hex(12)(换页符)。

  • skip-empty: (bool) 跳过没有文本的页面。

  • grid: 垂直坐标差不超过此值(以点为单位)的行将被合并到同一输出行。仅与“layout”模式相关。请谨慎使用:大多数情况下,3 或默认值 2 应足够。如果值过大,原始文档中意图不同的行可能会被合并,导致输出混乱和/或不完整。如果值过小,输入行中的某些跨度可能会生成伪影的单独输出行,仅仅因为它们以稍微不同的字体属性进行编码。

  • fontsize: 仅包含 fontsize 大于此值(默认 3)的文本。仅与“layout”选项相关。


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