命令行接口#

  • 版本 1.16.8 中的新功能

PyMuPDF 还可以从命令行使用,以执行工具函数。此功能应使编写一些最基本的脚本变得多余。

诚然,MuPDF CLI mutool确实存在一些功能重叠。另一方面,PDF 嵌入文件不再被 MuPDF 支持,因此 PyMuPDF 在这里提供了一些独特的东西。

调用#

可以通过两种方式调用命令行接口。

  • 使用已安装的 pymupdf 命令:

    pymupdf <command and parameters>
    
  • 或者使用Python的 -m 开关与PyMuPDF的 fitz 模块:

    python -m fitz <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: fitz 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: fitz 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: fitz 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. 每个输入必须以 “文件名,密码,页数” 的形式输入。密码和页数是可选的。

  2. 当使用“pages”条目时,密码输入是必需的。如果PDF不需要密码,请指定两个逗号。

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

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

示例:要合并以下文件

  1. file1.pdf: 所有页面,从后到前,没有密码

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

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

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

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

低级信息#

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

pymupdf show -h
usage: fitz 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 ]
>>

嵌入文件命令#

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

信息#

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

pymupdf embed-info -h
usage: fitz 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: fitz 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: fitz 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: fitz 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: fitz 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: fitz 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中的新功能

从任意 支持的文档 提取文本到文本文件。目前,有三种可用的输出格式模式:简单、块排序和物理布局的复制。

  • 简单文本提取按文档页面中的出现方式重复所有文本——并未努力以任何特定的阅读顺序重新排列。

  • 块排序 按照垂直坐标升序,然后是横坐标对文本块(由 MuPDF 识别)进行排序。这应该足以为基本的文本页面建立“自然”的阅读顺序。

  • 布局 努力重现输入页面的原始外观。您可以期待像这样的结果(由命令 pymupdf gettext -pages 1 demo1.pdf 生成):

_images/img-layout-text.jpg

注意

“gettext”命令提供了类似于XPDF软件的命令行工具pdftotext的功能, http://www.foolabs.com/xpdf/ – 尤其对于“布局”模式,这结合了该工具的-layout-table选项。

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

注意

对于“布局”模式,仅支持水平、自左向右、自上而下的文本,其他文本将被忽略。在此模式下,如果文本的 fontsize 太小,文本也会被忽略。

“简单”与“块”模式对比输出所有文本,适用于任何文本大小或方向。

命令:

pymupdf gettext -h
usage: fitz 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。与其他命令一样,您可以选择页面范围 (注意:基于1的索引!) ,如上所述,采用 mutool 格式。

  • 模式: (str) 选择一个格式化模式 - 默认是“布局”。

  • noligatures: (bool) 相当于 not TEXT_PRESERVE_LIGATURES。如果指定,则将连字(在高级字体中存在:将多个字符组合在一起的字形,如“fi”)拆分为其组成部分(即“f”,“i”)。默认情况下是直接通过它们。

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

  • extra-spaces: (布尔值) 对应于 not TEXT_INHIBIT_SPACES。如果指定,大字符之间的空隙将用一个或多个空格填充。默认是关闭的。

  • noformfeed: (布尔值) 代替 hex(12) (换页符),在输出页面的末尾写入换行符 \n

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

  • 网格: 垂直坐标差异不超过该值(以点为单位)的线将被合并到同一输出行中。仅在“布局”模式下相关。 谨慎使用: 在大多数情况下,3或默认的2应该足够。如果过大,在原始图中意图不同的线可能会被合并,这将导致输出出现混乱和/或不完整。如果过低,则可能会为输入行中的某些跨度生成伪影分离的输出行,仅仅因为它们用略有偏差属性的不同字体编码。

  • 字体大小: 仅包含大于该值的文本 fontsize(默认值为3)。 仅对“布局”选项相关。


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