命令行接口#
版本 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]]'
注意
每个输入必须以 “文件名,密码,页数” 的形式输入。密码和页数是可选的。
当使用“pages”条目时,密码输入是必需的。如果PDF不需要密码,请指定两个逗号。
“pages”格式与本节开头解释的相同。
每个输入文件在使用后会立即关闭。因此,您可以使用其中一个作为输出文件名,从而覆盖它。
示例:要合并以下文件
file1.pdf: 所有页面,从后到前,没有密码
file2.pdf: 最后一页,第一页,密码:“secret”
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生成):
注意
“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)。 仅对“布局”选项相关。