命令行界面#
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]]'
注意
每个输入必须按“filename,password,pages”格式输入。密码和页面是可选的。
如果使用了“pages”项,则密码项是必需的。如果 PDF 不需要密码,请指定两个逗号。
“pages”格式与本节开头说明的格式相同。
每个输入文件在使用后会立即关闭。因此,您可以使用其中一个作为输出文件名,从而覆盖它。
示例:要合并以下文件
file1.pdf: 所有页面,从后往前,无密码
file2.pdf: 最后一页,第一页,密码:“secret”
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
生成)

注意
“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”选项相关。