变更日志#
版本 1.26.0 中的变化 (2025-05-22)
使用 MuPDF-1.26.1。
修复的问题
修复 4324: cluster_drawings() 无法聚类水平和垂直细线
修复 4363: 搜索问题
修复 4404: page.get_links() 中的 IndexError
修复 4412: 回归?虚假错误?v1.25.4 中 insert_pdf 的问题
修复 4423: 在 1.25.3 版本后遇到错误:pymupdf.mupdf.FzErrorFormat: code=7: 无法在 xref 中找到对象
修复 4435: get_pixmap 方法卡在某一页
修复 4439: 从数据创建新的 Xml 类不起作用 - 代码错误
修复 4445: 损坏的 XREF 表修复不正确
修复 4447: 无法正确设置注释的描边颜色
修复 4479: set_layer_ui_config() 切换所有图层而不是只切换一个
修复 4505: 向上追溯 Widget 标志值至其父结构
其他
版本 1.25.5 中的变化 (2025-03-31)
修复的问题
其他
使用 MuPDF-1.25.6。
修复了 MuPDF 在 MacOS 上使用特定字体时出现的段错误。
修复了
Annot.get_textpage()
的clip
参数。修复了 Python-3.14 (预发布) 构建错误。
版本 1.25.4 中的变化 (2025-03-14)
使用 MuPDF-1.25.5。
修复的问题
其他
修复了合并 PDF 时处理重复小部件名称的问题 (PR #4347)。
改进了 Pyodide 构建。
通过禁用 PY_LIMITED_API,避免了 Python-3.13 中与 SWIG 相关的构建错误。
版本 1.25.3 中的变化 (2025-02-06)
使用 MuPDF-1.25.4。
修复的问题
其他
在注释中:* 添加了对子类型 FreeTextCallout 的支持。* 添加了对富文本的支持。
向 insert_text*() 添加了 miter_limit 参数,以允许抑制由长斜接引起的尖角。
向
Document.insert_pdf()
添加了小部件支持。向 span 字典添加了
bibi
。向 char 字典添加了
synthetic
。修复了 Pyodide 构建。
版本 1.25.2 中的变化 (2025-01-17)
修复的问题
其他
使用 Python 内置的字形名称 <> Unicode 转换。
提高了 pixmap 颜色反转的速度。
向 span 字典添加了新的
char_flags
成员,例如允许检测不可见文本。在 TextPage 输出中检测图像遮罩。
添加了
Pixmap.pil_image()
。
版本 1.25.1 中的变化 (2024-12-11)
版本 1.25.0 中的变化 (2024-12-05)
使用 MuPDF-1.25.1。
修复的问题
版本 1.24.14 中的变化 (2024-11-19)
使用 MuPDF-1.24.11。
修复的问题
修复 3448: get_pixmap 函数移除表格,只留下内容
修复 3758: 使用 add_redact_annot/apply_redactions 时出现 “malloc(): unaligned tcache chunk detected Aborted (core dumped)”
修复 3813: Stories: 有嵌套无序列表时有序列表计数错误
修复 3933: font.valid_codepoints() - 功能异常
修复 4018: PyMuPDF 在向后迭代零页 PDF 页面时挂起
修复 4043: fullcopypage 错误
修复 4047: add_redact_annot 中出现段错误
修复 4050: doc.embfile_info() 返回的字典内容与文档不符
其他
确保
Page.get_text()
返回的单词不包含 RTL/LTR 字符混合。修复了使用系统 MuPDF 进行构建的问题。
添加了点和向量的点积。
版本 1.24.13 中的变化 (2024-10-29)
修复的问题
版本 1.24.12 中的变化 (2024-10-21)
修复的问题
目前支持的 Python 版本为 3.9-3.13。
由于生命周期结束,停止支持 Python-3.8。
由于已发布,添加了对 Python-3.13 的支持。
版本 1.24.11 中的变化 (2024-10-03)
使用 MuPDF-1.24.10。
修复的问题
现在 Wheels 使用 Python Stable ABI
每个平台都有一个 PyMuPDF wheel。
每个 wheel 都适用于所有支持的 Python 版本。
每个 wheel 都使用支持的最旧的 Python 版本(目前是 3.8)构建。
没有 PyMuPDFb wheel。
其他
改进了 get_text_words() 的 sort=True 功能。
现在测试总是获取所需 Python 包的最新版本。
移除了对 setuptools 的依赖。
在下面的 PyMuPDF-1.24.10 变化中添加了条目 - 修复 #3630。
版本 1.24.10 中的变化 (2024-09-02)
使用 MuPDF-1.24.9。
修复的问题
修复 3450: get_pixmap 函数处理时间过长
修复 3569: SVG 图像创建未忽略无效 OCGs
修复 3603: ObjStm 压缩和 PDF 线性化不能同时工作
修复 3650: 每个字母之间插入换行符
修复 3661: 更新 Document 以检查 /XYZ 长度
修复 3698: 文档问题 - 注释文档中存在旧代码
修复 3705: Document.select() 在某些特定类型的 PDF 文件中行为异常
修复 3706: 扩展 Document.__getitem__ 类型注释,以反映该方法也接受切片
修复 3727: 方法 get_pixmap() 导致程序退出,没有任何异常或消息
修复 3767: 使用 Tesseract-OCR 5 无法获取 Tessdata
修复 3773: Link.set_border 出现 TypeError: ‘<’ 在 ‘NoneType’ 和 ‘int’ 实例之间不支持
修复 3774: fitz.__version__` 不再工作
修复 3789: 调用 insert_pdf 时抛出 ValueError: 值不足,无法解包(预期 3 个,得到 2 个)
修复 3820: 类改进了 namedDest 处理
修复 3630: page.apply_redactions 产生不想要的黑色矩形
其他
对象流和线性化不能同时使用;尝试这样做将引发异常。(#3603)
修复了处理不存在的 /Contents 对象的问题。
版本 1.24.9 中的变化 (2024-07-24)
使用 MuPDF-1.24.8。
版本 1.24.8 中的变化 (2024-07-22)
修复的问题
其他
修复了 codespell 发现的各种拼写错误。
改进了在 Windows 上修改 MuPDF 默认配置的方式。
使文本搜索支持连字。
版本 1.24.7 中的变化 (2024-06-26)
版本 1.24.6 中的变化 (2024-06-25)
使用 MuPDF-1.24.4
修复的问题
修复 3599: Story.fit_width() 有一条奇怪的线
修复 3594: Amazon 可持续发展报告提取乱码
修复 3591: Page.get_drawings() 中的 ‘width’ 返回宽度等于 0
修复 3561: 使用 page.apply_redactions() 时出现 ZeroDivisionError: float division by zero
修复 3559: 在 insert_htmlbox 中使用空的 H1 H2 H3 H4 等元素时出现 SegFault 11
修复 3539: 添加虚线网格线检测到表格识别
修复 3519: get_toc(simple=False) AttributeError: ‘Outline’ object has no attribute ‘rect’
修复 3510: page.get_label() 在文档第一页获取错误的标签
修复 3494: 1.24.2/1.24.3: 使用 subset_fonts 和 insert_pdf 时引入了虚假字符
修复 3470: subset_fonts 错误退出,没有异常/警告
修复 3400: 在 pymupdf 1.24.2 中,set_toc 改变了一些旋转页面的链接坐标
修复 3347: 指向高度不同的页面上点的链接不正确
修复 3237: Set_metadata() 不工作
修复 3493: 将 PyMuPDF 与其他库隔离;与 GdkPixbuf 等其他库一起加载 PyMuPDF 时出现问题
其他
修复了由于使用常量临时文件名导致 PyMuPDF 并发使用的问题。
在发布中添加了 musllinux x86_64 wheels。
添加了更清晰的版本信息
pymupdf.pymupdf_version
.pymupdf.mupdf_version
.pymupdf.pymupdf_date
.
版本 1.24.5 中的变化 (2024-05-30)
修复的问题
其他
更多修复,以便使用 MuPDF 的浮点格式化。
移除/禁用了部分不必要的诊断。
修复了 utils.do_links() 崩溃问题。
实验性新函数
pymupdf.apply_pages()
和pymupdf.get_text()
。解决了标签样式“a”和“A”错误的标签生成问题。
版本 1.24.4 中的变化 (2024-05-16)
其他
修复了 sysinstall 测试在安装新版本前未能移除所有先前安装的问题。
修复了
utils.do_links()
崩溃问题。更正了 TextPage 创建代码。
统一了各种诊断信息。
修复了
page_merge()
中的错误。
版本 1.24.3 中的变化 (2024-05-09)
现在 Python 模块名为
pymupdf
。fitz
仍然支持以保证向后兼容。使用 MuPDF-1.24.2。
修复的问题
其他
新增/修改的方法
Page.remove_rotation()
: 新增,在保持外观的同时将页面旋转角度设为零。
修复了检查 PDF 属性时的一些问题。
修复了从 sdist 构建 pip 包的问题(参见讨论 3360: Alpine linux docker 构建失败,“找不到 pymupdfb==1.24.1 的匹配发行版”)。
版本 1.24.2 中的变化 (2024-04-17)
从发布中移除了过时的经典实现(以前作为模块
fitz_old
提供)。修复的问题
其他
新增/修改的方法
Document.bake()
: 新增,将注释/字段设为永久内容。Page.cluster_drawings()
: 新增,基于几何邻近性识别属于同一组的绘图项(即矢量图形或线条艺术)。Page.apply_redactions()
: 添加了新参数text
。Document.subset_fonts()
: 使用 MuPDF 的pdf_subset_fonts()
而不是 PyMuPDF 代码。
Document 类现在支持指定为切片的页码。
避免引起 MuPDF 警告。
版本 1.24.1 中的变化 (2024-04-02)
修复的问题
其他
使用 MuPDF-1.24.1。
支持 ObjStm 压缩。方法
Document.save()
、Document.ez_save()
和Document.write()
现在支持新参数use_objstm
、compression_effort
和preserve_metadata
。
版本 1.24.0 中的变化 (2024-03-21)
修复的问题
修复 3281: 准备元数据 (pyproject.toml) 未成功运行
修复 3279: PyMuPDF 不再能在 Alpine Linux 中构建
修复 3257: apply_redactions() 删除注释框外的文本
修复 3216: AttributeError: ‘Annot’ 对象没有属性 ‘__del__’
修复 3207: get_drawings 的项中缺少 h 路径操作符的行
修复 3201: 合并 PDF 时出现内存泄漏
修复 3197: page.get_text() 对某些字符返回十六进制文本
修复 3196: 1.23.25 版本中移除文本不起作用(与 1.20.2 对比)
修复 3172: PDF 的 45 度线条在 PNG 转换中消失
修复 3135: 不将警告记录到 stdout
修复 3125: get_pixmap 方法卡在某一页并永远运行
修复 2964: page.get_pixmap() 函数生成的图像存在问题
其他
使用 MuPDF-1.24.0。
添加了对编辑矢量图形的支持。
表格模块的多项修复
添加了将表格输出为 markdown 字符串的新方法。
解决了计算表头对象时的错误
现在允许 None 作为单元格值,因为这将在需要时(例如在 pandas DataFrame 中)被解析。
以前我们试图在所有表头单元格边界框中强制使用类似 rect 的元组,但对于所有列都为 None 的表格这会失败。此修复使这成为可能,并在相应的单元格字符串中构造一个空字符串。
现在我们正确地将线条的起点/终点包含在聚类图形的边界框中。之前我们连接了线条的矩形 - 这没有效果,因为它总是空的。
改进了打开文档失败时的异常文本。
修复了使用新的 libclang 18 进行构建的问题。
版本 1.23.26 中的变化 (2024-02-29)
修复的问题
其他
版本 1.23.25 中的变化 (2024-02-20)
修复的问题
其他
构建时,可以使用环境变量
PIPCL_PYTHON_CONFIG
直接指定 python-config。
版本 1.23.24 中的变化 (2024-02-19)
修复的问题
其他
可以使用
sudo pip install
测试系统安装,而不是使用 venv。
版本 1.23.23 中的变化 (2024-02-18)
修复的问题
修复 3126: 使用 pathlib.Path 初始化 Archive 失败。
修复 3131: 调用 Annot 的 next 属性时引发“No attribute .parent”警告
修复 3134: 自 1.23.9 版本以来,在 Page.get_pixmap 中使用 IRect 作为 clip 参数不再工作
修复 3140: PDF 文档关闭后仍在使用
修复 3150: doc.select() 在此文档上挂起。
修复 3163: 使用 fitz.IRect 时出现 AssertionError
修复 3177: fitz.Pixmap(None, pix) 构造 Pixmap 时参数无法识别
其他
通过使用新的 MuPDF 函数
pdf_rearrange_pages()
改进了Document.select()
。这是一个更完整(且更快)的实现,不仅重新排列页面,还会对目录、指向已删除页面的链接以及可选内容定义中受影响的条目进行相应更改。TextWriter.appendv()
: 添加了small_caps
参数。修复了 MuPDF master 中的一些 valgrind 错误。
修复了使用 MuPDF master 构建时
Document.insert_image()
的问题。
版本 1.23.22 中的变化 (2024-02-12)
修复的问题
其他
从 PyMuPDF 中移除了对 MuPDF 函数
fz_image_size()
的使用。
版本 1.23.21 中的变化 (2024-02-01)
修复的问题
其他
修复了 set_xml_metadata() 中的错误,PR 3112: 修复 pdf_add_stream 元数据错误
修复了从
Annot.get_textpage()
获取的 TextPage 缺少.parent
成员的问题。修复了
Page.add_widget()
中的错误。
版本 1.23.20 中的变化 (2024-01-29)
错误修复
修复 3100: get_xml_metadata 中访问了错误的内部属性
其他
显著提高了
Document.get_toc()
的速度。
版本 1.23.19 中的变化 (2024-01-25)
错误修复
其他
查找表格时
查找表格时允许添加用户定义的“虚拟”矢量图形。
确认矢量图形的包围边界框位于裁剪矩形内。
避免慢速查找矩形交集。
添加了
Font.bbox
属性。
版本 1.23.18 中的变化 (2024-01-23)
错误修复
修复 3081: doc.close() 未关闭文档
其他
减小了 sdist 的大小以适应 pypi.org(通过减小两个测试文件的大小)。
如果没有
Desc
项,则修复Annot.file_info()
。
版本 1.23.17 中的变化 (2024-01-22)
错误修复
其他
修复了
Page.links()
中的错误 (PR #3075)。修复了
Page.get_bboxlog()
与图层相关的问题。添加了对 scripts/ 和 tests/run_compound.py 中超时的支持。
版本 1.23.16 (2024-01-18) 中的变更
错误修复
修复 3058: 从 CMYK JPEG 创建的 Pixmap 生成 RGB 格式
其他
在表格检测策略 “lines_strict” 中,排除仅填充的矢量图形。
修复了 sysinstall 测试失败的问题。
在文档中,更新功能矩阵,添加了关于文本写入的条目。
版本 1.23.15 (2024-01-16) 中的变更
错误修复
修复 3050: python3.9 pix.set_pixel 在 c.append( ord(i)) 中存在问题
其他
改进了
Page.find_tables()
的文档。
版本 1.23.14 (2024-01-15) 中的变更
错误修复
其他
对于已去除旋转的页面,确保
Page.get_drawings()
中有效的 “re” 矩形。
版本 1.23.13 (2024-01-15) 中的变更
错误修复
其他
修复了
Rect.height
和Rect.width
使其永不返回负值。修复了
TextPage.extractIMGINFO()
返回的dictkey_yres
值。
版本 1.23.12 (2024-01-12) 中的变更
修复 3027: Page.get_text 抛出针对 ‘parent’ 的属性错误
版本 1.23.11 (2024-01-12) 中的变更
修复了一些 Pixmap 构建错误。
修复了
Pixmap.yres()
。
版本 1.23.10 (2024-01-12) 中的变更
错误修复
修复 3020: 无法调整 PixMap 大小
其他
修复了
Page.delete_image()
。
版本 1.23.9 (2024-01-11) 中的变更
默认使用新的 “rebased” 实现。
旧的 “经典” 实现可通过
import fitz_old as fitz
使用。有关我们为何转向 rebased 实现的更多信息,请参见:https://github.com/pymupdf/PyMuPDF/discussions/2680
使用 MuPDF-1.23.9。
错误修复 (仅限 rebased 实现)
修复 2911: rebased 实现中 Page.derotation_matrix 返回元组而不是 Matrix
修复 2919: rebased 版本:合并 PDF 时 resolve_names 中的 KeyError
修复 2922: 允许插入命名目的地链接的新功能无效
修复 2943: ZeroDivisionError: 使用 apply_redactions() 时浮点数除以零
修复 2950: 测试期间调用 pip 存在问题
修复 2954: 文本提取中的替换 Unicode 字符
修复 2957: apply_redactions() 移动文本
修复 2961: 传递字符串作为页码时抛出 IndexError 而非 TypeError。
修复 2969: annot.next 抛出 AttributeError
修复 2978: 1.23.9rc1: 模块 ‘fitz.mupdf’ 没有属性 ‘fz_copy_pixmap_rect’
修复 2907: python 3.12 中对某些 PDF 调用 clean_contents 时发生段错误
修复 2905: SystemError: <内置函数 TextPage_extractIMGINFO> 返回设置了异常的结果
修复 2742: 将同一个源页面插入目标页面三次(而非两次)时发生段错误
其他
添加了设置不透明度的可选参数到
Page.insert_htmlbox()
。修复了在 #2934 中提及的
add_redact_annot()
中的问题。修复了
Page.rotation()
对于非 PDF 文档返回 0 而非抛出异常。修复了内部的四边形检测,使其能够处理任何 Python 序列。
修复了 rebased 版本的
fitz.pymupdf_version_tuple
- 之前设置为 mupdf 版本。改进了对 Linux 系统安装的支持,包括在 Github 上添加定期测试。
添加了缺失的
flake8
到scripts/gh_release.py:test_packages
。使用了 MuPDF-1.23.8 中新增的公共函数。
改进了
scripts/test.py
,以帮助调查 MuPDF 问题。
版本 1.23.8 (2023-12-19) 中的变更
错误修复 (仅限 rebased 实现)
错误修复 (rebased 和 经典 实现)
修复 2885: pymupdf find tables 过慢
其他
Rebased 实现
Page.insert_htmlbox()
: 一个新的、功能强大得多的替代方案,替代Page.insert_textbox()
或TextWriter.fill_textbox()
,使用 Story。Story.fit*()
: 用于将 Story 放入扩展矩形的新方法。Story.write_with_links()
: 添加了对外部链接的支持。Document.language()
: 修复为使用 MuPDF 新的mupdf.fz_string_from_text_language2()
。Document.subset_fonts()
- 已修复。修复了内部的
Archive._add_treeitem()
方法。修复了
fitz_new.__doc__
以包含 PyMuPDF 和 Python 版本信息,以及 OS 名称。移除了对
(*args, **kwargs)
的使用,现在在 API 中显式指定关键字参数。支持使用了新的 MuPDF Python 异常类。
修复了
button_states()
在 /AP 指向间接对象时返回 None 的错误。修复了 pillow 测试,使其不再忽略所有错误,并在测试时安装 pillow。
添加了
fitz.css_for_pymupdf_font()
的测试 (使用包pymupdf-fonts
)。简化了 Github Actions 测试规范。
更新了
tests/README.md
。
版本 1.23.7 (2023-11-30) 中的变更
rebased 实现中的错误修复 (经典实现未修复的)
错误修复 (rebased 和 经典 实现)
使用 MuPDF-1.23.7。
其他
Rebased 实现
已在测试套件中添加 flake8 代码检查,并进行了各种修复。
在 Document 构造函数期间禁用诊断以匹配经典实现。
对 2553 的额外修复: 版本 >= 1.22 中存在无效字符
已修复 MuPDF Bug 707324: Story: HTML 表格行背景色重复不正确
添加了
scripts/test.py
,用于简单构建+测试 PyMuPDF git checkout。添加了
fitz.pymupdf_version_tuple
,例如(1, 23, 6)
。恢复了对 2345 错误回退的修复: 关闭 utils.py 中的 print 语句
在
mupdf_warnings()
返回的警告信息中包含任何末尾的... repeated <N> times...
文本(仅限 rebased)。
版本 1.23.6 (2023-11-06) 中的变更
错误修复
其他
使用 MuPDF-1.23.5。
添加 Document.resolve_names()(仅限 rebased 实现)。
版本 1.23.5 (2023-10-11) 中的变更
错误修复
已修复 2341: linkDest 中处理 LINK_GOTO 的 zoom 部分中的负值
已修复 2522: set_layer() 中的拼写错误 - NameError: name ‘f’ is not defined
已修复 2548: 调用 fitz.Page.get_text_blocks 方法时,Fitz 在某些 PDF 上冻结。
已修复 2596: save(garbage=3) 导致 get_pixmap() 出现副作用并损坏
已修复 2635: “clean=True” 使对象在 PDF 中不可见
已修复 2637: Page.insert_textbox 错误处理了开始新行的最后一个单词
已修复 2699: 提取表格下方的段落
已修复 2703: 边界情况(“page.get_texttrace()”)中字体大小计算错误
已修复 2710: page.rect 和文本位置错误 / 与旧版本不同
已修复 2723: Python 3.12 的 wheel 何时可用?
已修复 2730: 持久的 get_text() 格式
其他
使用 MuPDF-1.23.4。
修复系统安装时的优化标志。
修复了表格识别时 clip 参数不生效的问题
支持 Pillow 模式“RGBa”
支持额外的单词分隔符
支持检查有效的 PDF 名称对象
版本 1.23.4 (2023-09-26) 中的变更
改进了构建说明。
修复了 rebased 实现中的 Tesseract 问题。
改进了使用系统 MuPDF 进行构建/安装。
修复了 Pyodide 构建。
修复了 rebased bug in _insert_image()。
错误修复
版本 1.23.3 (2023-08-31) 中的变更
修复了 Tesseract OCR 的使用问题。
版本 1.23.2 (2023-08-28) 中的变更
已修复 #2613: 1.23.0 版本不兼容 MacOS-arm64
版本 1.23.1 (2023-08-24) 中的变更
更新了 README 和包摘要描述。
修复了在某些 Python-3.10(可能更早版本)的 Linux 安装上,
import fitz
失败并出现ImportError: libcrypt.so.2: cannot open shared object file: No such file or directory
的问题。修复了 MacOS arm64 上的
incompatible architecture
错误。修复了 Poetry 关于 wheel 的 RECORD 文件中缺少条目的安装警告。
版本 1.23.0 (2023-08-22) 中的变更
为 Page 对象添加了方法
find_tables()
。这允许在任何支持的文档页面上定位表格,并按单元格提取表格内容。
PyMuPDF 的新“rebased”实现。
rebased 实现作为 Python 模块
fitz_new
可用。可以通过import fitz_new as fitz
将其用作直接替代品。与 Python 无关的 MuPDF 库现在位于第二个名为
PyMuPDFb
的 wheel 中,pip 将自动安装。这是为了节省 pypi.org 上的空间 - 完整版本只需为每个操作系统提供一个
PyMuPDFb
wheel。错误修复
其他变更
放弃了对 Python-3.7 的支持。
修复了错误的页面 / 注解
/Contents
清理。我们需要将
pdf_filter_options::no_update
设置为零。添加了新函数 get_tessdata()。
处理
/Annot
数组问题。以前在方法 Document.insert_pdf 中复制页面注解时,我们没有检查
/Annots
数组成员的有效性。对于有缺陷的成员(如 null 或非字典项),这可能导致不必要的异常。此修复实现了更多检查并跳过此类数组项。额外的注解类型检查。
以前在获取/设置注解边框属性时,我们没有检查注解类型。现在根据 MuPDF 进行了检查。
提高容错性。
避免在源页面包含
/Annots
数组中的无效项时,在方法insert_pdf()
中出现异常。对于适用的注解,返回空边界字典。
以前即使对于不适用的注解类型,我们也会返回非空边界字典。现在在这种情况下返回空字典
{}
。这需要在注解.update()
方法中进行一些相应的更改,特别是对于虚线和边框宽度。限制
set_rect
于适用的注解类型。我们以前对
set_rect()
方法未充分排除不适用的注解类型。现在让 MuPDF 捕获不受支持的注解,并在这些情况下返回False
。在
page.get_texttrace()
中错误的字体大小计算。计算字体大小时,我们使用了最终文本转换矩阵,而应该使用
span->trm
。这里进行了修正。更新以适应最新 MuPDF 的变化。
pdf_lookup_anchor()
已被移除。更新 fill_textbox 以更好地遵循 rect.width
fill_textbox 中的函数 norm_words 在其最后一个循环中存在一个 bug,它在实际测量 n 个字符的宽度时附加了 n+1 个字符。这导致 fill_texbox 中当你尝试写入一个主要由“宽”字母(M,m, W, w…)组成的单词时出现 bug,导致写入的文本超出给定的 rect。
修复方法只是将 n+1 替换为 n。
为 widget 添加
script_focus
和script_blur
选项。
版本 1.22.5 (2023-06-21) 中的变更
此版本使用
MuPDF-1.22.2
。错误修复
已修复 #2365: 类型为“fs”的绘图的字典值不正确。
已修复 #2391: 当我们多次更新同一复选框时,复选框会自动取消选中。
已修复 #2400: 同一行文本内的间隙未用空格填充。
已修复 #2404: 在 PDF 中对图像进行黑线处理不会移除 1.22.X 版本中的底层内容。
已修复 #2430: 错误地减少了 Py_None 的引用计数。
已修复 #2450: 对于 1.22.* 版本中带有填充和描边操作的路径,填充颜色和填充不透明度为空。
已修复 #2462: 在 “get_drawing(extended=True )” 处出错
已修复 #2468: 尝试获取绘图时出现解码错误
已修复 #2710: page.rect 和文本位置错误 / 与旧版本不同
已修复 #2723: Python 3.12 的 wheel 何时可用?
新特性
变更 注解现在支持“云状”边框。
Annot.border
属性新增了项目clouds
,并且方法Annot.set_border()
支持相应的clouds
参数。变更 同一单选按钮组中的单选按钮 widget 现在如果以标准方式定义,将得到一致更新。
新增 支持 PDF 可选内容中的
/Locked
键。此数组位于 catalog entry/OCProperties
内,现在可以提取和设置。新增 支持 OCR 函数中的新参数
tessdata
。新函数get_tessdata()
如果安装了 Tesseract,可以定位语言支持文件夹。
版本 1.22.3 (2023-05-10) 中的变更
此版本使用
MuPDF-1.22.0
。错误修复
已修复 #2333: 无法在表单中设置任何单选按钮组
版本 1.22.2 (2023-04-26) 中的变更
此版本使用
MuPDF-1.22.0
。错误修复
已修复 #2369: 较新版本中的图像提取错误
版本 1.22.1 (2023-04-18) 中的变更
此版本使用
MuPDF-1.22.0
。错误修复
版本 1.22.0 (2023-04-14) 中的变更
此版本使用
MuPDF-1.22.0
。行为变更
文本提取现在包含与剪裁矩形重叠的字形;以前只有当它们完全包含在剪裁矩形内时才会被包含。
错误修复
已修复 #1763: 交互式(智能表单) PDF 表单计算在 pymupdf 中不起作用
已修复 #1995: RuntimeError: 尝试处理长页 PDF 文件时图像过高
已修复 #2093: 应用密文删除后 PDF 中的图像颜色发生变化
已修复 #2108: 密文删除移除的文本超出预期
已修复 #2141: 尝试获取块时读取 JPX 头部失败
已修复 #2144: 替换图像抛出错误
已修复 #2146: “None”对象的引用计数处理错误
已修复 #2161: 支持直接将图像作为页面添加
已修复 #2168:
page.add_highlight_annot(start=pointa, stop=pointb)
不工作已修复 #2173: Pixmap 中使用的 Colorspace 双重释放
已修复 #2179: pixmap.tint_with() 文档不正确
已修复 #2208: Pushbutton widget 显示为复选框
已修复 #2210: apply_redactions() 在密文删除后将 PDF 文本向右移动
已修复 #2220: Page.delete_image() | 对象没有属性 is_image
已修复 #2228: 打开某些 PDF 文件花费太多时间
已修复 #2238: Bug - 在最新版本 1.21.1 中无法从文件提取数据
已修复 #2242: 如果在 Story.element_positions() 中回调函数原型错误,Python 会静默退出
已修复 #2246: TextWriter 在错误位置写入文本
已修复 #2248: 密文删除内容后,剩余文本的位置发生变化
已修复 #2250: 文档:page.rst 中的链接不清晰或损坏
已修复 #2251: mupdf_display_errors 在加载损坏图像时对 Pixmap 不适用
已修复 #2270: Annot.get_text(“words”) - 不返回第一行的单词
已修复 #2275: insert_image:文档说明旋转是逆时针的
已修复 #2278: 无法通过添加标志 PDF_FIELD_IS_READ_ONLY 使 widget(复选框)只读
已修复 #2290: Page.get_text(“dict”) 和 Fitz.get_page_images() 返回不同的图像格式/数据
已修复 #2293: 在我的机器上从 sdist 安装时 68 个测试失败
已修复 #2300: 树(parents)中递归过多,导致程序终止
已修复 #2322: add_highlight_annot 使用 clip 在 PDF 中生成“A Number is Out of Range”错误
其他
为选定的按钮表单字段的底层注解对象添加键“/AS (Yes)”。
移除未使用的 Document 方法
has_xref_streams()
和has_old_style_xrefs()
,因为 MuPDF 中相应的等效方法已被移除。添加新的 Document 方法和属性用于获取/设置
/PageMode
、/PageLayout
和/MarkInfo
。新的 Document 属性
version_count
,包含增量保存次数加一。新的 Document 属性
is_fast_webaccess
,指示文档是否已线性化。DocumentWriter 现在是一个上下文管理器。
添加对 Pixmap JPEG 输出的支持。
添加对绘制圆角矩形的支持。
get_drawings():添加可选参数
extended
。修复了跟踪设备状态初始化不正确的问题;从
fitz.Page.get_texttrace()
等方法返回的数据可能会略有改变,例如linewidth
值。如果在当前目录包含无效的
fitz/
目录时看起来正在使用 PyMuPDF,则向stderr
输出警告,因为这会破坏fitz
模块的导入。例如,当当前目录是 PyMuPDF 检出目录时,尝试使用fitz
就会发生这种情况。
文档
总体重构
引入了新的主页和新的目录。
结构更新以包含新的“关于”部分。
比较与性能图表。
在附录中包含性能方法论。
更新 conf.py 以将单反引号理解为代码。
将双反引号转换为单反引号。
移除冗余文件。
改进
insert_file()
文档。get_bboxlog():为
get_bboxlog()
添加可选参数layers
。Page.get_texttrace():添加新的字典键
layer
,表示可选内容组的名称。在安装文档中提及使用 Python venv。
在版本 1.21.1 的变更日志中添加了对 #2057 的缺失修复。
修复了指向 PyMuPDF-Utilities 仓库脚本的许多链接。
避免
changes.txt
和docs/changes.rst
的重复。
构建
添加
pyproject.toml
文件以改进使用 pip 等工具的构建。
版本 1.21.1 (2022-12-13) 中的变更
此版本使用
MuPDF-1.21.1
。错误修复
已修复 #2110: 如果完全嵌入的字体占用多个对象,则仅部分提取。
已修复 #2094: 矩形检测逻辑
已修复 #2088: toc 中命名链接未设置目标点
已修复 #2087: 未提取带有 Filter “[/FlateDecode/JPXDecode]” 的图像
已修复 #2086: Document.save() 的 owner_pw 和 user_pw 存在缓冲区溢出错误
已修复 #2076: fitz.py 中出现段错误
已修复 #2057: Document.save 的 garbage 参数在 PyMuPDF 1.21.0 中不起作用
已修复 #2051: 缺失 DPI 参数
已修复 #2048: 最新版本 1.21.0 中 TextPage 和 bbox 的大小无效
已修复 #2045: SystemError: <built-in function Page_get_texttrace> 返回的结果设置了错误标志
已修复 #2039: 1.21.0 无法针对系统 libmupdf 构建
已修复 #2036: Archive::Archive 定义了两次
其他
吞掉链接 URI 字符串中的 “&zoom=nan”。
添加新的 Page 工具方法
Page.replace_image()
和Page.delete_image()
。
文档
版本 1.21.0 (2022-11-8) 中的变更
此版本使用
MuPDF-1.21.0
。新功能:Stories。
添加了 Python-3.11 的 wheel。
错误修复
已修复 #1701: 自定义图像插入中断。
已修复 #1854:
Document.delete_pages()
拒绝关键字参数。已修复 #1868: 在
page.apply_redactions()
处发生访问冲突错误。已修复 #1909: 添加
fontname="Helvetica"
的文本可能会静默失败。已修复
draw_rect()
: 如果未指定颜色,则不尊重宽度。已修复
subset_fonts()
: 使其能够静默标准输出。已修复 #1936: 矩形检测可能不正确,产生错误输出。
已修复 #1945: 使用
clean=True
保存时发生段错误。已修复
pdfocr_save()
严重崩溃。已修复 #1971: 使用
get_drawings()
时发生段错误。已修复 #1946:
get_text()
文档中block_no
和block_type
位置互换。已修复 #2013: AttributeError: 在删除 widget 时,‘Widget’ 对象没有属性 ‘_annot’。
核心代码的其他更改
修复了各种编译器警告和一个序列点错误。
添加了对 Memento 构建的支持。
修复了 Memento 在测试套件中检测到的内存泄漏。
修复了 set_name() 和 set_rect() 中异常的处理。
允许使用最新的 MuPDF 构建,以便定期测试 PyMuPDF master 分支。
处理在为某些 Annot 类型设置 rect 时出现的新 MuPDF 异常。
减少了 MuPDF 的 config.h 和 PyMuPDF 的 _config.h 之间的外观差异。
处理 MuPDF API 的各种更改。
其他
修复了文档中的各种损坏链接和拼写错误。
提及在 MacOS 上为 #875 安装
swig-python
。添加了 macos-arm64 的(未经测试的)wheel。
版本 1.20.2 中的变更
此版本使用
MuPDF-1.20.3
。已修复 #1787。修复了 Unix 系统上的链接问题。
已修复 #1824。应用密文删除与透明图像重叠时发生段错误。(在
MuPDF-1.20.3
中修复。)sphinx 生成文档的改进
改进了
docs/installation.rst
中关于从源代码构建的信息。澄清了
docs/tools.rst
中内存分配设置JM_MEMORY`
。修复了
docs/app3.rst
中指向 PDF 参考手册的链接。修复了在 OpenBSD 上构建 html 文档的问题。
将旧的
docs/faq.rst
移动到单独的docs/recipes-*
文件中。
移除了部分未使用文件和目录
installation/
docs/wheelnames.txt
版本 1.20.1 中的变更
已修复 #1724。修复了在 FreeBSD 上构建的问题。
已修复 #1771。在 1.20.0 中引入的
linkDest()
调用re.match()
有误。已修复 #1751。
get_drawings()
和get_cdrawings()
以前总是返回closePath=False
。已修复 #1645。FreeText 注解的默认文本颜色现在是黑色。
sphinx 生成文档的改进
使用 readthedocs 主题并增强。
将
.txt
文件重命名为使用.rst
后缀。
版本 1.20.0 中的变更
此版本使用 MuPDF-1.20.0
,发布于 2022-06-15。
处理新的 MuPDF 链接 URI 格式,从
#<int>,<int>,<int>
变更为#page=<int>&zoom=<float>,<float>,<float>
。
在
tests/test_insertpdf.py
中,使用新的参考输出joined-1.20.pdf
。我们还检查新的输出值与旧值大致相同。
已修复 #1738。
pdf_graft_map
内存泄漏。同时修复了由此暴露的 SEGV 问题,原因是底层 fz_document 释放不正确。已修复 #1733。修复了
Annotation.get_pixmap()
的所有权问题。
构建/发布流程变更
如果 pip 因为没有可用的合适 wheel 而从源代码构建,我们不再要求预先安装 MuPDF。相反,所需的 MuPDF 源代码嵌入在 sdist 中并自动构建到 PyMuPDF 中。
修改
setup.py
以根据需要下载所需的 MuPDF 版本。详细信息请参阅 setup.py 开头的注释。添加
.github/workflows/build_wheels.yml
文件以控制在 Github 上构建 wheel。
版本 1.19.6 中的变更
已修复 #1620。
Page.get_textpage()
创建的 TextPage 现在将正确释放(移除了内存泄漏)。已修复 #1601。文档打开错误现在应该更简洁易懂。在此过程中,添加了两个 PyMuPDF 特定的 Python 异常:
EmptyFileError
– 尝试从空文件或零长度内存创建 Document (fitz.open()
) 时引发。FileDataError
– 当 MuPDF 遇到不可恢复的文档结构问题时引发。
新增
Page.load_widget()
,给定 PDF 字段的 xref。新增 字典
pdfcolor
,它提供了定义为 PDF 颜色值的约 500 种颜色,以小写颜色名称作为键。新增 为 Quad 类添加了代数功能。这些对象现在也可以相互加减,并可以与数字和矩阵相乘。
新增 定义默认文本提取标志的新常量,以便更方便地处理。它们的命名约定类似于 page.get_text(“words”) 的
TEXTFLAGS_WORDS
。请参阅 文本提取标志默认值。变更
Page.annots()
和Page.widgets()
,使其检测并防止在迭代器循环内通过Document.reload_page()
(非法地)重新加载页面。这样做会导致解释器崩溃。文档中提供了在正确设计的循环内进行注解和 widget 批量更新的干净方法。变更 几个内部工具函数,使其成为独立的(“SWIG inline”),而不是 Tools 类的一部分。这其中包括提高了几何对象创建的性能。
变更
Document.update_stream()
,使其始终接受流更新 - 无论 xref 后面的字典对象是否已经是流。因此,以前的new
参数现在被忽略,并将在 v1.20.0 中移除。
版本 1.19.5 中的变更
已修复 #1521。这与问题 #1510 背后的根本原因相同。
已修复 #1513。某些可选内容函数不支持非 ASCII 字符。
已修复 #1510。支持更多软遮罩图像子类型。
已修复 #1507。针对大纲链中是
"null"
对象的项进行免疫处理。已修复 重新打开的 #1417。(“打开文件过多”)。这是由于对 MuPDF 的
fz_drop_document()
调用不足造成的。这也修复了 #1550。已修复 几个未记录的问题,这些问题与错误设置文本跨度原点
point_like
有关。已修复 在文本翻转(而不是仅旋转)时,方法
Page.get_texttrace()
计算字符 bbox 的未记录错误。新增 在
image_properties()
返回的字典中添加了项:orientation
和transform
报告图像的自然方向(EXIF 数据)。新增 方法
Document.xref_copy()
。它将使给定的目标 PDF 对象成为源对象的精确副本。
版本 1.19.4 中的变更
已修复 #1505。针对循环大纲项进行免疫处理。
已修复 #1484。现在在所有情况下都返回正确的 CropBox 坐标。
已修复 #1479。
已修复 #1474。TextPage 对象现在再次被正确删除。
新增 用于 PDF
/ArtBox
、/BleedBox
、/TrimBox
的 Page 方法和属性。新增 全局属性
TESSDATA_PREFIX
,用于轻松检查 OCR 支持。变更
Document.xref_set_key()
,以便如果字典键设置为值"null"
,则将物理删除该键。变更
Document.extract_font()
,使其可选地返回一个字典(而不是一个元组)。
版本 1.19.3 中的变更
此补丁版本针对 Pixmap 实现了一些微小改进,同时也包含一些重要修复。
已修复 #1351。回退了在 v1.18.15 中引入内存增长的代码。
已修复 #1417。开发了使用
Document.insert_pdf()
解决打开文件句柄增长的规避方法。已修复 #1418。开发了使用
Document.insert_pdf()
解决内存增长的规避方法。已修复 #1430。开发了解决文档页面大量生成 pixmap 的规避方法。
已修复 #1433。解决了 PyMuPDF 文本处理中某些 Type 3 字体的 bbox 错误。
新增
Pixmap.color_topusage()
,用于确定最常用颜色的占比。解决了 #1397。新增
Pixmap.warp()
,它可以在 pixmap 内部从给定的任意凸四边形创建一个新的 pixmap。新增
Annot.irt_xref
和Annot.set_irt_xref()
,用于查询或设置注解的/IRT
(“回复对象”)属性。实现了 #1450。新增
Rect.torect()
和IRect.torect()
,它们计算一个将变换到给定另一个矩形的矩阵。变更
Pixmap.color_count()
,使其也返回每种颜色的计数。变更
Page.get_texttrace()
,使其在span["dir"] != (1, 0)
时也返回正确的跨度和字符 bbox。
版本 1.19.2 中的变更
此补丁版本针对 Page.get_drawings()
实现了一些微小改进,同时也包含一些重要修复。
已修复 #1388。修复了插入或更新注解时间歇性内存损坏的问题。
已修复 #1375。
Page.get_text()
的“words”和“dict”选项返回的行号不一致的问题已得到纠正。已修复 #1364。
recover_span_quad()
中检查是否为"rawdict"
跨度现在工作正常。已修复 #1342。纠正了
Page.show_pdf_page()
中矩形无限性检查的问题。变更
Page.get_drawings()
、Page.get_cdrawings()
,使其返回矩形覆盖区域方向的指示器。这实现了 #1355。此外,矩形和四边形的识别率也得到了显著提高。变更 所有文本搜索和提取方法,使其默认将新的
flags
选项TEXT_MEDIABOX_CLIP
设置为 ON。该位导致自动抑制完全位于页面 mediabox 之外的所有字符(只要文档类型支持该概念)。这消除了使用clip=page.rect
或类似方法省略可见区域之外文本的需要。新增 参数
"dpi"
到Page.get_pixmap()
和Annot.get_pixmap()
。给定该参数时,参数"matrix"
将被忽略,并创建一个具有所需每英寸点数的 Pixmap。新增 属性
Pixmap.is_monochrome
和Pixmap.is_unicolor
,允许快速检查 pixmap 属性。解决了 #1397。新增 方法
Pixmap.color_count()
,用于确定 pixmap 中的独特颜色。新增 布尔参数
"compress"
到 PDF 文档方法Document.update_stream()
。解决了 / 启用了 #1408 的解决方案。
版本 1.19.1 中的变更
这是第一个支持 MuPDF v1.19.0 的补丁版本。除了一处错误修复外,它还包括对 OCR 支持的重要改进以及将提取的文本按标准阅读顺序“从左上到右下”排序的选项。
已修复 #1328。“words”文本提取再次返回正确的
(x0, y0)
坐标。变更
Page.get_textpage_ocr()
:现在它支持参数dpi
以控制 OCR 质量。还可以选择是 OCR 整个页面还是仅 OCR 页面显示的图像。变更
Page.get_drawings()
和Page.get_cdrawings()
,使其自动将颜色转换为 RGB 颜色元组。实现了 #1332。Page.get_texttrace()
也应用了类似的更改。变更
Page.get_text()
,使其支持参数sort
。如果设置为True
,则输出会方便地排序。
版本 1.19.0 中的变更
这是支持 MuPDF 1.19.* 的第一个版本,发布于 2021-10-05。与之前的 1.18.* 版本相比,它引入了许多新特性。
PyMuPDF 现在已集成了 Tesseract OCR 支持,这在 MuPDF v1.18.0 中已经存在。
支持的图像可以通过其 Pixmap 进行 OCR,生成带有文本层的单页 PDF。
所有支持的文档页面(即不限于 PDF)都可以使用专用的文本提取方法进行 OCR。结果是标准文本和 OCR 文本的混合(取决于页面哪个部分被认为需要 OCR),可以进行无限制的搜索和提取。
所有这一切都需要独立安装 Tesseract。MuPDF 实际上(仅)需要 Tesseract 的
"tessdata"
文件夹位置,其中存储了其语言支持数据。该位置必须作为环境变量TESSDATA_PREFIX
可用。
MuPDF 的一个新特性是 **PDF 更新日志记录(journalling)**,PyMuPDF 版本也支持此功能。更改可以记录、回滚或重放,从而实现对 PDF 文档完整性的全新级别的控制——类似于现代数据库系统中存在的功能。
第三个特性(与新的 MuPDF 版本无关)包括检测页面对象何时相互覆盖或隐藏的能力。例如,现在可以查看文本是否被绘图或图像覆盖。
变更 重要几何概念的术语和含义:矩形现在被描述为 *有限*、*有效* 或 *空*,而这些术语的定义也发生了变化。具体来说,矩形现在被认为是“开放”的:并非所有角和边都被视为矩形的一部分。详细信息请阅读 Rect 部分。
新增 为
Document.save()
/Document.tobytes()
方法添加了新参数"no_new_id"
。使用它可以抑制更新文档/ID
的第二个项,PDF 中该项指示原始文件已被更新。如果 PDF 还没有/ID
,则也不会创建新的。新增 用于 PDF 更新的 **日志记录(journalling)工具**。这允许记录更改、撤销或重做更改,或保存日志供以后使用。请参阅
Document.journal_enable()
等方法。新增 新的 Pixmap 方法
Pixmap.pdfocr_save()
和Pixmap.pdfocr_tobytes()
,它们生成一个包含 pixmap 作为 PNG 图像和 OCR 文本层的单页 PDF。新增
Page.get_textpage_ocr()
,它对页面执行光学字符识别,然后提取结果并将其与“正常”页面内容一起存储在 TextPage 中。在后续的文本提取和文本搜索中使用或重用此对象,以避免重复工作。现有的文本搜索和文本提取方法已扩展以支持单独创建的 textpage – 请参阅下一项。新增 为文本提取和文本搜索方法添加了新参数
textpage
。这允许重用先前创建的 TextPage,从而显著提高了运行时性能——这对于新的 OCR 功能尤其重要。但“正常”文本提取也肯定能从中受益。新增
Page.get_texttrace()
,这是一个提供底层文本字符属性的技术方法。之前它是一个私有方法,但作者认为它现在已经足够成熟,可以正式提供。它特别包含一个“序列号”,指示绘制文本的页面外观构建操作。新增
Page.get_bboxlog()
,它提供了文本、图像或绘图等页面对象的矩形列表。其重要性在于其顺序:与索引较低区域相交的矩形会覆盖或隐藏它们。变更 方法
Page.get_drawings()
和Page.get_cdrawings()
,使其包含一个指示创建绘图的页面外观构建操作的“序列号”。已修复 #1311。组合框中的字段值现在应该得到正确处理。
已修复 #1290。错误是由于不正确的矩形空检查引起的,此版本新的几何逻辑修复了该问题。
已修复 #1286。密文删除注解的文本对齐现在再次正常工作。
已修复 #1287。非 Windows 系统在应用某些密文删除时出现的无限循环问题已得到解决。
已修复 #1284。在某些情况下应用密文删除后文本布局被破坏的问题已得到解决。
版本 1.18.18 / 1.18.19 中的变更
已修复 问题 #1266。在重要情况下设置
Pixmap.samples
失败的问题已在新版本 1.18.19 中热修复。已修复 问题 #1257。现在可以从 PDF 字段中移除只读标志。
已修复 问题 #1252。现在可以正确指定 PDF 链接注解的
zoom
值。已修复 问题 #1244。现在可以正确计算
Page.get_image__bbox()
中的变换矩阵。已修复 问题 #1241。防止
Page.get_textbox()
返回伪影字符,这在某些情况下会发生。已修复 问题 #1234。避免在角落案例中创建无限矩形 –
Page.get_drawings()
、Page.get_cdrawings()
。新增 将测试数据和测试脚本添加到 PyPI 源代码分发包中。
版本 1.18.17 中的变更
此版本的重点是选定函数的重大性能改进。
已修复 问题 #1199。在
Document.get_page_images()
等方法中使用不存在的页码将不再导致段错误。变更
Page.get_drawings()
,使其现在区分“描边”、“填充”和组合路径。现在支持包含多个矩形(即“re”项)的路径。提取“剪裁”路径现在作为一项选项可用。新增
Page.get_cdrawings()
,它是Page.get_drawings()
的性能优化版本。新增
Pixmap.samples_mv
,它是 pixmap 像素区域的 memoryview。它不进行复制,因此总是访问该区域的当前状态。新增
Pixmap.samples_ptr
,它是指向 pixmap 像素区域的 Python“指针”。允许更快地创建 Qt 图像(速度提升 800 倍以上)。
版本 1.18.16 中的变更
已修复 问题 #1184。PDF 中现有的 PDF widget 字体现在可以接受(即不再强制更改为 Base-14 字体)。
已修复 问题 #1154。指定
clip
时,文本搜索结果现在应该正确。已修复 问题 #1152。
已修复 问题 #1146。
新增
Link.flags
和Link.set_flags()
到 Link 类。实现了增强请求 #1187。新增 模拟
TextWriter.fill_textbox()
输出的选项,用于预测给定文本在文本框中将占据的行数。新增 文本输出支持作为子命令
gettext
到fitz
CLI 模块。最重要的是,现在支持原始物理文本布局的再现。
版本 1.18.15 中的变更
已修复 问题 #1088。移除注解的填充颜色现在应该再次以两种方式工作:使用
Annot.update()
中的fill_color=[]
参数以及Annot.set_colors()
中的fill=[]
参数。已修复 问题 #1081。
Document.subset_fonts()
: 修复了导致某些字体字符宽度错误的问题。已修复 问题 #1078。
Page.get_text()
和其他与文本提取相关的方法:更改了 TextPageflags
参数的默认值。现在保留所有空格和ligatures
。已修复 问题 #1085。现在正确定义了
fitz.detTextlength
的旧的 *snake_cased* 别名。变更
Document.subset_fonts()
,它现在将使用适当的六个大写字母标签正确地为字体子集添加前缀,符合 PDF 规范。新增 新方法
Widget.button_states()
,它返回按钮类型字段在设置为“开”或“关”时可能具有的值。新增 为 Font 和 TextWriter 类添加了对带有 **小型大写字母(Small Capital)** 的文本的支持。这体现在它们的各种方法中新增了一个布尔参数
small_caps
。
版本 1.18.14 中的变更
完成 为方法和属性实现了新的、“snake_cased”名称,这些名称以前是“camelCased”且在许多方面都不方便。本文档末尾有一个 已弃用名称 部分,其中包含更多背景信息和旧名称到新名称的映射。
已修复 问题 #1053。
Page.insert_image()
: 如果给定,在哈希计算中包含图像遮罩。已修复 问题 #1043。将
Pixmap.getPNGdata
添加到Pixmap.tobytes()
的别名中。已修复 计算
Page.get_drawings()
返回的绘制路径包围矩形时的内部错误。修复了通过
TextWriter.fill_textbox()
输出文本时偶尔导致循环的内部错误。新增了
Font.char_lengths()
方法,该方法返回字符串的字符宽度元组。新增了在
Document.delete_pages()
中指定页面的更多方式。现在可以指定序列(列表、元组或范围),也可以使用 Pythondel
语句。在使用del
语句的情况下,也接受 Pythonslices
。更改了
Document.del_toc_item()
方法,该方法用于禁用目录(TOC)中的单个项目:以前,它会移除标题文本。现在,支持此功能的查看器会显示整个项目为灰色。
版本 1.18.13 的更改
修复了问题 #1014。
修复了计算图片边框时(
Page.get_image_bbox()
)的一个内部内存泄漏问题。新增了对 PDF trailer 进行低级别访问和修改的支持。适用于
Document.xref_get_keys()
、Document.xref_get_key()
和Document.xref_set_key()
方法。新增了关于在 PDF 元数据中维护私有条目的文档。
新增了关于处理透明图片插入的文档,例如
Page.insert_image()
方法。新增了
Page.get_image_rects()
方法,它是Page.get_image_bbox()
的改进版本。更改了
Document.delete_pages()
方法,以支持指定要删除页面的各种方式。实现了问题 #1042。更改了
Page.insert_image()
方法,使其也接受文件中现有图片的 xref。这允许在页面之间“复制”图片,并实现极快的多重插入。更改了
Page.insert_image()
方法,使其也接受整数参数alpha
。用于提高性能。更改了
Pixmap.set_alpha()
方法,以支持用于将颜色与其 alpha 值预乘以及将特定颜色设置为完全透明(例如白色)的新参数。更改了
Document.embfile_add()
方法,使其自动设置创建和修改日期时间。相应地,Document.embfile_upd()
方法自动维护修改日期时间(/ModDate
PDF 键),并且Document.embfile_info()
方法相应地报告这些数据。此外,嵌入文件的关联“集合项”通过其xref
包含在内。这支持 PDF 组合应用程序的开发。
版本 1.18.11 / 1.18.12 的更改
修复了问题 #972。改进了源代码分发材料的布局。
修复了问题 #962。稳定了用于从源代码生成 PyMuPDF 的 Linux 发行版检测。
新增:
Page.get_xobjects()
方法返回Document.get_page_xobjects()
的结果。新增:
Page.get_image_info()
方法返回页面上显示的图片的所有元信息。新增:
Tools.mupdf_display_warnings()
方法允许设置是否显示 MuPDF 生成的警告。默认为关闭。新增:
Document.ez_save()
是Document.save()
的便捷别名,带有一些不同的默认值。更改: 文档页面的图片提取现在也包含图片的变换矩阵。这涉及到
Page.get_image_bbox()
方法以及Page.get_text()
方法的 DICT、JSON、RAWDICT 和 RAWJSON 变体。
版本 1.18.10 的更改
修复了问题 #941。为
DisplayList.get_pixmap()
和DisplayList.get_textpage()
方法添加了旧的别名。修复了问题 #929。稳定了使用
Document.scrub()
方法移除 JavaScript 对象的功能。修复了问题 #927。移除了重写后的
TextWriter.fill_textbox()
中的一个循环。更改了
Document.xref_get_keys()
和Document.xref_get_key()
方法,使其也允许访问 PDF trailer 字典。这可以通过使用-1
作为 xref 号参数来实现。新增了许多用于重建通过
Page.get_text()
方法选项“dict”和“rawdict”提取的文本行、span 和字符的四边形(quads)的函数。请参见recover_quad()
及相关函数。新增了
Tools.unset_quad_corrections()
方法,用于抑制字符四边形修正(偶尔需要用于错误的字体)。
版本 1.18.9 的更改
修复了问题 #888。移除了关于 PyMuPDF 许可证的模糊陈述,现在明确声明许可证为 GNU AGPL V3。
修复了问题 #895。
修复了问题 #896。自 v1.17.6 起,PyMuPDF 抑制了字体子集标签,并在文本提取输出“dict”/“json”/“rawdict”/“rawjson”中仅报告基础字体名称。现在可以通过新的全局参数
Tools.set_subset_fontnames()
请求旧的行为。修复了问题 #885。Pixmap 创建现在也支持以
pathlib.Paths
形式给定的文件名。更改了
Document.subset_fonts()
方法:文本不再重写,因此应该保留其所有原始属性——例如隐藏或受可选内容机制控制。更改了 TextWriter 输出,使其也接受从右到左模式的文本(阿拉伯语、希伯来语):
TextWriter.fill_textbox()
、TextWriter.append()
。这些方法现在接受一个新的布尔参数right_to_left
,默认为 False。实现了问题 #897。更改了
TextWriter.fill_textbox()
方法,使其返回未放入给定矩形中的所有文本行。还将warn
参数的默认值更改为在溢出情况下不再打印警告消息。新增了一个实用函数
recover_quad()
,用于计算 span 的四边形(quadrilateral)。此函数可用于正确标记使用Page.get_text()
的“dict”或“rawdict”选项提取的文本。
版本 1.18.8 的更改
这仅是一个错误修复版本。由于潜在广泛使用的函数,我们提前发布。
修复了问题 #881。修复了在从文件或内存插入图片时,
Page.insert_image()
方法中的内存泄漏问题。修复了问题 #878。
pathlib.Path
对象现在应该能正确处理文件路径层次结构。
版本 1.18.7 的更改
新增了一个实验性的
Document.subset_fonts()
方法,该方法根据字体在 PDF 文本中的使用情况来减小符合条件的字体大小。实现了问题 #855。实现了请求 #870:
Document.convert_to_pdf()
方法现在也支持 PDF 文档。重命名了
Document.write
为Document.tobytes()
,以提高清晰度。但弃用的名称仍可使用一段时间。实现了请求 #843:
Document.tobytes()
方法现在支持线性化的 PDF 输出。Document.save()
方法现在也支持写入 Python 文件对象。此外,open 函数现在也支持 Python 文件对象。修复了问题 #844。
修复了问题 #838。
修复了问题 #823。增加了更多逻辑以更好地支持 OCR 文本输出(Tesseract、ABBYY)。
修复了问题 #818。
修复了问题 #814。
新增了
Document.get_page_labels()
方法,该方法返回 PDF 的页面标签定义列表。新增了
Document.has_annots()
和Document.has_links()
方法,用于检查 PDF 中是否存在这些对象类型。新增了专家低级别函数,以简化 PDF 对象源的查询和修改:
Document.xref_get_keys()
列出对象xref
的键,Document.xref_get_key()
返回键的类型和内容,以及Document.xref_set_key()
修改键的值。新增了
Document.scrub()
方法的参数thumbnails
,使其也允许移除页面缩略图。改进了关于如何为非水平文本添加有效文本标记批注的文档。
我们继续进行将方法和属性从 “mixedCase” 重命名为 “snake_case” 的过程。文档通常只提及新名称,但旧的、已弃用的名称仍可用一段时间。
版本 1.18.6 的更改
修复了问题 #812。
修复了问题 #793。之前无效的文档元数据有时会阻止打开某些文档。此错误已移除。
修复了问题 #792。如果使用默认的
clip=None
,文本搜索和文本提取将完全不进行矩形包含检查。修复了问题 #785。
修复了问题 #780。更正了一个参数检查错误。
修复了问题 #779。修复了拼写错误。
新增了一个选项,用于设置文本框的所需行高。实现了问题 #804。
更改了文本位置检索,以更好地应对 Tesseract 的无字形字体。实现了问题 #803。
新增了一个选项,用于选择新批注、字段和链接的前缀,以提供唯一的批注 ID。实现了请求 #807。
新增了获取和设置 PDF 目录项的颜色和文本属性。实现了问题 #779。
新增了 PDF 页面标签处理功能:
Page.get_label()
返回页面标签,Document.get_page_numbers()
返回具有指定标签的所有页码,以及Document.set_page_labels()
添加或更新 PDF 的页面标签定义。
注意
此版本引入了 Python 类型提示。目标是为所有函数和方法的每个参数和返回值提供类型信息。这项工作仍在进行中,尽管大部分函数已经处理完毕。
版本 1.18.5 的更改
除了几处修复外,此版本还专注于几项次要但重要的功能改进。其中包括更精确地计算适当的行高和插入点,以便写入/插入文本。与使用与字体无关的常量不同,这些值现在取自字体的属性。
另请注意,这是第一个不再提供 Python 3.6 之前版本预生成 wheel 包的版本。PIP 也将在 2020 年底停止对这些版本的支持。
修复了问题 #771。通过使用“small glyph heights”选项,可以提取整个页面文本。
修复了问题 #768。
修复了问题 #750。
修复了问题 #739。 “dict”、“rawdict”以及相应的 JSON 输出变体现在有两个新的 span 键:“
ascender
”和“descender
”。这些浮点数表示特殊的字体属性,可用于计算刚好是字体大小高度的 span 或字符的 bboxes(与默认行高不同)。示例算法显示在“Span Dictionary”部分 此处。还改进了在某些字体中遇到的错误指定的 ascender / descender 值的检测和修正。新增了一个新的实验性方法
Tools.set_small_glyph_heights()
– 也是为了响应问题 #739。此方法设置或取消设置一个全局参数,使其始终以字体大小高度计算 bboxes。如果设置为“on”,文本搜索和所有文本提取都将返回高度较小的矩形、bboxes 和 quads。修复了问题 #728。
更改了“Polyline”批注的填充颜色逻辑:此参数现在仅与线条末端符号有关——批注本身不再能有填充颜色。也解决了问题 #727。
更改了
Page.getImageBbox()
方法,使其在图片包含在 XObject 中时也能计算 bbox。更改了
Shape.insertTextbox()
、Page.insertTextbox()
和TextWriter.fillTextbox()
方法,使其在计算行高和插入点时尊重字体的“ascender”/“descender”属性。这应该不再导致多行输出时的线条重叠。这些方法以前忽略字体特定性而使用常量值。
版本 1.18.4 的更改
此版本增加了一些功能以支持 PDF 可选内容。其中包括 OCMD(Optional Content Membership Dictionaries),具有完整的“可见性表达式”(PDF 键 /VE
)范围,文本插入(包括 TextWriter 类)和绘图。
修复了问题 #727。FreeText 批注现在在
fill_color=None
时支持无色矩形。修复了问题 #726。现在为 HTML / XML
Page.getText()
输出处理 UTF-8 编码错误。修复了问题 #724。空值不再存储在 PDF
/Info
元数据字典中。新增了新方法
Document.set_oc()
和Document.get_oc()
,用于为现有图片和表单 XObject 设置或获取可选内容引用。这些方法类似于 Annot 的同名方法。新增了
Document.set_ocmd()
、Document.get_ocmd()
用于处理 OCMD。新增了对文本插入和绘图的可选内容支持。
新增了新方法
Page.deleteWidget()
,用于从页面删除表单字段。这类似于删除批注。新增了对 Popup 批注的支持。这包括定义 Popup 矩形以及设置 Popup 的打开或关闭状态。相关方法/属性包括
Annot.set_popup()
、Annot.set_open()
、Annot.has_popup
、Annot.is_open
、Annot.popup_rect
、Annot.popup_xref
。
其他变更
PyMuPDF 中方法和属性的命名远未令人满意:我们到处都有 CamelCases、mixedCases 和 lower_case_with_underscores。以 Annot 作为第一个候选,我们已经开始逐步清理这项工作,将方法和属性转换为 lower case with underscores,同时保持常量为 UPPERCASE。
旧名称仍将保留,以防止代码中断,但文档中将不再提及它们。
所有类的新方法和属性将按照新标准命名。
版本 1.18.3 的更改
作为一个主要的新功能,此版本引入了对 PDF 可选内容概念的支持。
修复了问题 #714。
修复了问题 #711。
修复了问题 #707:如果提供了 PDF 用户密码,但未提供或不存在所有者密码,则用户密码也用作所有者密码。
修复了
Document.save()
和Document.write()
方法的expand
和deflate
参数。现在单个图片和字体压缩应该最终起作用了。解决了问题 #713。新增了对 PDF 可选内容的支持。这包括几个新的 Document 方法,用于查询和设置可选内容状态,以及添加可选内容配置和组。此外,图片、表单 XObject 和批注现在可以绑定到可选内容规范。解决了问题 #709。
版本 1.18.2 的更改
此版本包含了一些有趣的文本搜索改进:现在返回任意数量的搜索结果,并且移除了 hit_max 参数。新的 clip 参数此外允许限制搜索区域。搜索现在会检测行尾的连字符,并相应地找到带连字符的单词。
修复了问题 #575:如果在文本搜索中使用
quads=False
,则同一行上重叠的矩形会合并。在此之前,搜索字符串中属于不同“标记内容”项目的各个部分都会生成自己的矩形——就像它们出现在单独的行上一样。新增了属性
Document.isRepaired
,如果 PDF 在打开时被修复,则此属性为 true。新增了
Document.setXmlMetadata()
方法,用于更新或创建 PDF XML 元数据。实现了问题 #691。新增了
Document.getXmlMetadata()
方法,返回 PDF XML 元数据。更改了 PDF 文档的创建:它们现在总是会在文档 trailer 中包含一个 PDF 标识符(
/ID
字段)。实现了问题 #691。更改了
Page.searchFor()
方法:接受新的参数clip
,用于将搜索限制在此矩形内。相应地,TextPage.rect
属性现在受到TextPage.search()
方法的尊重。更改了
Page.searchFor()
和TextPage.search()
方法中的参数hit_max
,此参数现在已过时:方法将返回所有匹配项。更改了
Page.getText()
方法中的字符选择标准:现在,如果字符的 bbox 完全包含在clip
中,则该字符被视为clip
的一部分。在此之前,非空交集就足够了。更改了
Document.scrub()
方法,以支持新的选项redact_images
。这解决了问题 #697。
版本 1.18.1 的更改
修复了问题 #692。PyMuPDF 现在可以检测并从 PDF 页面中更多的循环资源依赖项中恢复,并首次在 MuPDF 警告存储中报告它们。
修复了问题 #686。
新增了 Shape 类的透明度选项:描边和填充颜色现在可以设置为某个透明度值。这意味着所有 Page 绘图方法、方法
Page.insertText()
、Page.insertTextbox()
、Shape.finish()
、Shape.insertText()
和Shape.insertTextbox()
都支持两个新参数:stroke_opacity 和 fill_opacity。新增了
Page.insertImage()
方法的新参数mask
,用于可选地提供外部图片遮罩。解决了问题 #685。新增了
Annot.soundGet()
方法,用于提取音频批注的声音。
版本 1.18.0 的更改
这是第一个支持 MuPDF v1.18 的 PyMuPDF 版本。除了错误修复外,此版本的重点是扩展 PyMuPDF 自身的功能。后续的 PyMuPDF 补丁可能会解决 MuPDF 中的新功能。
修复了问题 #519。此上游错误偶尔只发生在某些页面上,现在似乎已修复:在这些情况下,页面布局应该不再会被破坏。
修复了问题 #675。
不成功的存储分配现在应该总是导致异常(规避了一个偶尔导致解释器崩溃的上游错误)。
Pixmap 大小现在基于 C 中的
size_t
而不是int
,即使对于非常大的 pixmap 也应该是正确的。
修复了问题 #668。PDF 绘图插入的虚线规范现在应该正确反映 PDF 规范。
修复了问题 #669。移除了
Page.insert_pdf()
方法中的一个主要的内存泄漏源。新增了关键字 “images” 到
Page.apply_redactions()
方法,用于精细控制图片的处理。新增了
Annot.getText()
和Annot.getTextbox()
方法,提供了与 Page 版本相同的功能。新增了键 “number” 到
Page.getText()
/Annot.getText()
方法选项“dict”和“rawdict”的块字典中。新增了
glyph_name_to_unicode()
和unicode_to_glyph_name()
函数。这两个函数并不真正连接到特定字体,现在也可以独立使用。数据现在基于 Adobe 字形列表。新增了便利函数
adobe_glyph_names()
和adobe_glyph_unicodes()
,它们返回相应的可用数据。新增了
Page.getDrawings()
方法,该方法返回文档页面上绘图操作的详细信息。适用于所有文档类型。改进了
Document.insert_pdf()
的性能。现在,从同一来源多次单独插入时,也会抑制多个对象复制。这节省了时间、内存和目标文件大小。以前,此机制仅在每个单独的方法执行中有效。此功能也可以通过新的方法布尔参数 final=1(默认值)来抑制。对于从 pixmap 创建的 PNG 图片,分辨率 (dpi) 现在会自动从相应的
Pixmap.xres
和Pixmap.yres
值中设置。
版本 1.17.7 的更改
修复了问题 #651。通过回溯 MuPDF 开发仓库的更改,修复了一个在某些边缘情况下的密文处理过程中导致解释器崩溃的上游错误。
修复了问题 #645。Pixmap 左上角坐标可以通过自己的方法
Pixmap.set_origin()
进行设置(再次可用)。新增了几个新方法以改进和加速目录(TOC)处理。其中包括,TOC 项目现在可以单独更改或删除——而无需总是替换整个 TOC。此外,现在无需先加载页面即可访问某些 PDF 页面属性。这对 TOC 操作的性能有非常显著的影响。
新增了
Document.insert_pdf()
方法的一个选项,允许显示进度消息。解决了 #640。新增了
Page.getTextbox()
方法,该方法提取矩形中包含的文本。在许多情况下,这应该使您无需为此类事情编写自己的脚本。新增了新参数
clip
到Page.getText()
方法,以简化和加速页面子区域的文本提取。新增了
TextWriter.appendv()
方法,用于在垂直书写模式下添加文本。解决了问题 #653。
版本 1.17.6 的更改
修复了问题 #605。
修复了问题 #600 – 文本现在应该也能正确地定位在 CropBox 小于 MediaBox 的页面上。
新增了文本 span 字典键
origin
,其中包含该 span 中第一个字符的左下角坐标。新增了属性
Font.buffer
,它是字体文件的 bytes 副本。新增了参数 sanitize 到
Page.cleanContents()
方法。允许切换 sanitization,因此仅进行语法清理。
版本 1.17.5 的更改
修复了问题 #561 – 第二次尝试:某些 TextWriter 在使用多种交替字体时未正确工作。
修复了问题 #566。
修复了问题 #568。
修复了问题 – 如果在
TextWriter.writeText()
方法中未给出,则透明度现在会正确地从 TextWriter 对象中获取。新增了一个新的全局属性
fitz_fontdescriptors
。包含来自仓库 pymupdf-fonts 可用字体的信息。新增了
Font.valid_codepoints()
方法,该方法返回字体包含字形的 unicode 码点数组。新增了选项
text_as_path
到Page.getSVGimage()
方法。这实现了问题 #580。如果设置为 False,将生成包含可解析文本的更小的 SVG 文件。
版本 1.17.4 的更改
修复了问题 #562。批注 Pixmap 不再派生自页面 Pixmap,从而避免了意外包含页面内容。
修复了问题 #559。此 MuPDF 错误正在使用 MuPDF 下一个版本的预发布版本进行临时修复。
新增了实用函数
repair_mono_font()
,用于纠正某些等宽字体的显示字符间距。新增了实用方法
Document.need_appearances()
,用于精细控制 Form PDF 的行为。解决了问题 #563。新增了实用函数
sRGB_to_pdf()
,用于恢复给定 sRGB 格式颜色整数的 PDF 颜色三元组。新增了实用函数
sRGB_to_rgb()
,用于恢复给定 sRGB 格式颜色整数的 (R, G, B) 颜色三元组。新增了实用函数
make_table()
,该函数根据给定矩形和所需的列数、行数生成表格单元格。新增了对仓库 pymupdf-fonts 中可选字体的支持。
版本 1.17.3 的更改
修复了一个未记录的问题,该问题在使用
Page.cleanContents()
方法时阻止了完全清理 PDF 页面。修复了问题 #540。EPUB 的文本提取应该再次正确工作。
修复了问题 #548。文档现在包括
LINK_NAMED
。新增了新参数,用于控制
TextWriter.fillTextbox()
方法中文本的起始位置。实现了问题 #549。更改了
Page.add_redact_annot()
方法的文档,以解释非内置字体的使用方法。
版本 1.17.2 的更改
版本 1.17.1 的更改
还显著改进了内联文档,以更好地支持交互式帮助。
版本 1.17.0 的更改
此版本基于 MuPDF v1.17。以下是新功能和更改功能的亮点。
新增了批注和 widget 的扩展语言支持:拉丁语、希腊语、俄语、中文、日语和韩语字符的混合现在可以在“FreeText”批注和文本 widget 中使用。无需特殊安排即可使用。
对于支持“章节”结构的文档(目前适用于 EPUB 文档),实现了更快的页面访问。这带来了一些新的 Document 方法,并更改了
Document.loadPage()
和“索引”页面访问 doc[n]:除了像以前一样指定页码外,还可以指定一个元组 (chaper, pno) 来标识所需的页面。更改: 改进了对密文批注的支持:密文重叠的图片通过擦除重叠区域而永久修改。如果链接被密文重叠,也会被移除。这现在与 PDF 规范完全同步。
其他变更
更改了
TextWriter.writeText()
方法以支持 “morph” 参数。新增了方法
Rect.morph()
、IRect.morph()
和Quad.morph()
,这些方法返回一个新的 Quad。更改了
Page.add_freetext_annot()
方法,使其通过新的参数 “align” 支持文本对齐。修复了问题 #508。改进了图片矩形计算,希望能提供在大多数(如果不是全部)情况下都正确的值。
修复了问题 #502。
修复了问题 #500。
Document.convertToPDF()
方法应该不再导致内存泄漏。修复了问题 #496。批注和 widget/字段现在使用未旋转页面的坐标添加或修改。此行为现在与修改 PDF 页面的其他方法同步。
新增了属性
Page.rotationMatrix
和Page.derotationMatrix
,以支持 PDF 页面旋转版本和原始版本之间的坐标转换。
潜在的破坏性代码更改
私有方法
Page._getTransformation()
已被移除。请改用公共属性Page.transformationMattrix
。
版本 1.16.18 的更改
此版本引入了几个围绕 PDF 文本输出的新功能。其动机是简化此任务,同时提供扩展功能。
一个主要的成就是利用 MuPDF 的能力,当当前字体中找不到字符时,动态选择回退字体。这对于 Base-14 字体与 CJK 字体(中国、日本、韩国)的组合无缝工作。因此,文本可以包含来自拉丁语、希腊语、俄语、中文、日语和韩语的任意字符组合。
修复了问题 #493。
Pixmap(doc, xref)
现在应该再次正确地表示加载的图片对象。修复了问题 #488。widget 名称现在可以修改。
新增了新的类 Font,表示一个字体。
新增了新的类 TextWriter,用作要在页面上写入的文本的容器。
新增了
Page.writeText()
方法,用于将一个或多个 TextWriter 对象写入页面。
版本 1.16.17 的更改
修复了问题 #479。PyMuPDF 现在应该更正确地报告图片分辨率。这适用于图片(无论是来自图片文件还是从 PDF 文档中提取的图片)和从图片创建的 pixmap。
新增了
Pixmap.set_dpi()
方法,该方法设置 x 和 y 方向的图片分辨率。
版本 1.16.16 的更改
版本 1.16.14 的更改
更改了文本标记批注以接受除四边形以外的参数,以便现在可以标记两点之间的文本行。
新增了
Document.scrub()
方法,该方法从 PDF 中移除潜在的敏感数据。实现了问题 #453。新增了
Annot.blendMode()
方法,该方法返回批注的混合模式。新增了
Annot.setBlendMode()
方法,用于设置批注的混合模式。这解决了问题 #416。更改了
Annot.update()
方法以接受额外的参数,用于设置混合模式和透明度。新增了高级图形功能以控制抗锯齿值,即
Tools.set_aa_level()
。解决了问题 #467。修复了问题 #474。
修复了问题 #466。
版本 1.16.13 的更改
新增了
Document.getPageXObjectList()
方法,该方法返回页面中表单 XObject 的列表。新增了
Page.setMediaBox()
方法,用于更改 PDF 页面物理尺寸。新增了 Page 方法,这些方法以前是内部方法:
Page.cleanContents()
(=Page._cleanContents()
),Page.getContents()
(=Page._getContents()
),Page.getTransformation()
(=Page._getTransformation()
)。
版本 1.16.12 的更改
修复了问题 #447。
修复了问题 #461。
修复了问题 #397。
修复了问题 #463。
新增了对 PDF 表单字段的 JavaScript 支持,从而修复了问题 #454。
新增了新的批注方法
Annot.delete_responses()
,该方法移除引用当前批注的“Popup”批注和响应批注。主要用于数据保护目的。新增了新的表单字段方法
Widget.reset()
,该方法将字段值重置为其默认值。更改和扩展了密文处理:如果图片和 XObject 包含在密文矩形中,则将其移除。任何部分重叠都只会用密文背景色覆盖。现在可以指定一个覆盖文本,将其插入到矩形区域,以取代已删除的原始文本。这解决了问题 #434。
版本 1.16.11 的更改
新增了通过方法
Page.add_redact_annot()
和Page.apply_redactions()
对密文批注的支持。修复了问题 #426(“PolygonAnnotation in 1.16.10 version”)。
版本 1.16.10 的更改
修复了问题 #421(“annot.set_rect(rect) has no effect on text Annotation”)。
修复了问题 #417(“Strange behavior for page.deleteAnnot on 1.16.9 compare to 1.13.20”)。
修复了问题 #415(“Annot.setOpacity throws mupdf warnings”)。
更改了所有“添加批注/widget”方法,以便在 PDF 键 /NM 中存储唯一的名称。
更改了
Annot.setInfo()
方法,使其除了字典外,还接受直接参数。更改了
Annot.info
属性,现在也显示批注的唯一 ID(PDF 键 /NM),如果存在的话。新增了
Page.annot_names()
方法,该方法返回所有批注名称(/NM 键)的列表。新增了
Page.load_annot()
方法,该方法根据批注的唯一 ID(/NM 键)加载批注。新增了
Document.reload_page()
方法,该方法在完成所有待处理更新后提供页面的新副本。
版本 1.16.9 的更改
修复了问题 #412(“功能请求:允许控制 TOC 条目是否应该折叠”)。
修复了问题 #411(“page.firstWidget 导致段错误”)。
修复了问题 #407(“Annot.setOpacity 问题”)。
更改了方法
Annot.setBorder()
、Annot.setColors()
、Link.setBorder()
和Link.setColors()
,使其也接受直接参数,而不仅仅是繁琐的字典。
版本 1.16.8 的更改
新增了几个新方法到 Document 类,使处理 PDF 低层结构更容易。我还决定将它们作为“正常”方法提供(而不是以“_”开头的私有方法)。这些方法是
Document.xrefObject()
、Document.xrefStream()
、Document.xrefStreamRaw()
、Document.PDFTrailer()
、Document.PDFCatalog()
、Document.metadataXML()
、Document.updateObject()
、Document.updateStream()
。新增了
Tools.mupdf_disply_errors()
方法,用于设置是否在 sys.stderr 上显示 mupdf 错误。新增了命令行功能。这是一个主要的新功能:您现在可以通过 “python -m fitz …” 调用几个实用函数。这应该可以取代许多最简单的脚本的需求。请参阅 命令行界面。
版本 1.16.7 中的变化
细微更改,以更好地同步 TextPage 图像块和 Document.extractImage()
图像的二进制图像流。
修复 问题 #394 (“使用 TOOLS.mupdf_warnings() 时 PyMuPDF 出现段错误”)。
更改 MuPDF 错误消息的重定向:除了将它们写入 Python sys.stderr 外,现在也将它们与 MuPDF 警告一起存储。
更改
Tools.mupdf_warnings()
为自动清空存储(除非通过参数停用)。更改
Page.getImageBbox()
在页面上找不到图像时返回一个无限矩形,而不是引发异常。
版本 1.16.6 中的变化
修复 问题 #390 (“注释删除不完整”)。
更改
Page.searchFor()
/Document.searchPageFor()
也支持 flags 参数,该参数控制包含在 TextPage 中的数据。更改
Document.getPageImageList()
、Document.getPageFontList()
及其 Page 对应方法以支持新参数 full。如果为 true,则返回的项将包含引用字体或图像的 Form XObject 的xref
。
版本 1.16.5 中的变化
文本提取方面有更多性能改进。
修复 问题 #381 的第二部分(参阅 v1.16.4 中的项目)。
新增
Page.getTextPage()
,因此文本提取不再需要创建中间显示列表。页面级别的文本提取和文本搜索现在基于此,这应该可以提高约 5% 的性能。
版本 1.16.4 中的变化
修复 问题 #381 (“TextPage.extractDICT ... 在升级到 1.16.3 后失败 ...”)
新增 方法
Document.pages()
,它提供页面范围上的生成器迭代器。新增 方法
Page.links()
,它提供页面链接上的生成器迭代器。新增 方法
Page.annots()
,它提供页面注释上的生成器迭代器。新增 方法
Page.widgets()
,它提供页面表单域上的生成器迭代器。更改
Document.is_form_pdf
现在包含控件数量,如果不是 PDF 或此数量为零,则为 False。
版本 1.16.3 中的变化
与 1.16.2 版本相比有细微更改。Page.getText()
的“dict”和“rawdict”变体的代码已移植到 C,大大提高了性能。这种改进在文本密集型文档中尤其明显,现在它们的执行速度应该快近两倍。
修复 问题 #369 (“mupdf: cmsCreateTransform failed”),通过移除 ICC 颜色空间支持。
更改
Page.getText()
现在接受额外的关键字“blocks”和“words”。它们将分别返回Page.getTextBlocks()
和Page.getTextWords()
的结果。因此,所有文本提取方法现在都通过统一的 API 提供。相应地,现在有新方法TextPage.extractBLOCKS()
和TextPage.extractWords()
。更改
Page.getText()
默认将位指示器 TEXT_INHIBIT_SPACES 设置为关闭。默认情况下不抑制额外空格的插入。
版本 1.16.2 中的变化
更改 Page 的文本提取方法,允许详细控制提取的数据量。
新增
planish_line()
,它将给定线段(定义为一对点)映射到 x 轴。修复 一个问题(没有 Github 编号),在使用
Page.getText()
加上“dict”选项时,遇到某些不可用 UTF-8 编码的字符会导致解释器崩溃。修复 问题 #362 (“getText('rawDICT') 内存泄漏”)。
版本 1.16.1 中的变化
新增 属性
Quad.is_convex
,它检查连接其上两点的线段是否包含在四边形中。更改
Document.insert_pdf()
现在允许在复制过程中独立丢弃或包含链接和注释。修复问题 #352 (“Corrupt PDF data and …”),该问题在使用此方法处理某些有问题的文件时似乎会间歇性发生。修复 一个错误,该错误在使用语法 “m1/m2” 进行矩阵除法时,导致矩阵 “m1” 被结果替换,而不是返回一个新的矩阵。
修复 问题 #354 (“Python 3.8 中的 SyntaxWarning”)。我们现在始终使用 “==” 来比较字面量(而不是 Python 关键字 “is”)。
修复 问题 #353 (“mupdf version check”),不再在与 MuPDF 仅存在补丁版本差异时拒绝导入。
版本 1.16.0 中的变化
MuPDF 的这个主要新版本带来了几项不错的新功能和更改功能。其中一些确实涉及编程 API 的更改。以下是已更改内容的概要
PDF 文档加密和解密现在完全支持。这包括设置权限、密码(用户和所有者密码)以及所需的加密方法。
为响应新的加密功能,PyMuPDF 返回一个整数(即位的组合)表示文档权限,不再是字典。
现在原生支持重定向 MuPDF 错误和警告。PyMuPDF 将 MuPDF 的错误消息重定向到 sys.stderr,不再缓冲它们。警告继续被缓冲,不会显示。存在用于访问和重置警告缓冲区的功能。
注释现在仅支持 PDF。
注释和控件(表单域)现在是页面上的独立对象链(尽管控件在技术上仍然是 PDF 注释)。这意味着,在使用
Page.firstAnnot
或Annot.next()
时,您将永远不会遇到控件。您必须使用Page.firstWidget
和Widget.next()
来访问表单域。作为 MuPDF 关于控件的更改的一部分,添加或更改表单域时,仅支持以下四种字体:Courier、Helvetica、Times-Roman 和 ZapfDingBats。
更改详情列表
新增
Document.can_save_incrementally()
,用于检查阻止使用Document.save()
的选项 incremental=True 的条件。新增
Page.firstWidget
,指向页面上的第一个域。新增
Page.getImageBbox()
,返回页面上显示的图像所占用的矩形。新增
Annot.setName()
,允许您更改(图标)名称域。新增
Page.getText()
中的文本颜色输出:“dict”、“rawdict”和“xml”选项现在也显示 sRGB 格式的颜色。更改
Document.permissions
现在包含布尔指示器的整数值——以前是字典。更改
Document.save()
、Document.write()
,现在完全支持基于密码的 PDF 文件解密和加密。更改了所有与注释和控件相关的 Python 常量的名称。如果您的脚本处理这两个类,请务必查阅常量和枚举章节。此决定源于取消对非 PDF 注释的支持。旧名称(以“ANNOT_*”或“WIDGET_*”开头)将作为已弃用同义词提供。
更改 控件的字体支持:添加或更改表单域时,仅接受 Cour (Courier)、Helv (Helvetica, 默认)、TiRo (Times-Roman) 和 ZaDb (ZapfDingBats)。仅支持纯净版本——不支持斜体或粗体变体。但是,读取控件时会显示其原始字体。
更改 警告缓冲区的名称为
Tools.mupdf_warnings()
,清空此缓冲区的功能现在称为Tools.reset_mupdf_warnings()
。更改
Page.getPixmap()
、Document.get_page_pixmap()
:现在可以使用新的布尔参数 annots 来抑制页面注释的渲染。更改
Page.add_file_annot()
和Page.add_text_annot()
以允许设置图标。移除 Annot 对象中与控件相关的方法和属性。
移除 Document 属性 openErrCode、openErrMsg,以及 Tools 属性/方法 stderr、reset_stderr、stdout 和 reset_stdout。
移除 PyMuPDF 中的第三方 zlib 依赖:MuPDF 中现已提供压缩函数。PyMuPDF 的源代码安装程序现在可以省略此额外安装步骤。
未发布 MuPDF v1.15.0 版本
版本 1.14.20 / 1.14.21 中的变化
更改 文本标记注释以支持多个矩形/四边形。这修复了问题 #341 (“Question : How to addhighlight so that a string spread across more than a line is covered by one highlight?”) 和类似问题 (#285)。
修复 问题 #331 (“导入 PyMuPDF 会全局改变警告过滤行为”)。
版本 1.14.19 中的变化
修复 问题 #319 (“使用自定义字体时 InsertText 函数出错”)。
新增 方法
Document.get_sigflags()
,返回 PDF 是否已签名的信息。解决问题 #326 (“如何在表单 PDF 中检测签名?”)。
版本 1.14.17 中的变化
新增
Document.fullcopyPage()
,用于在 PDF 中进行整页复制(不像Document.copyPage()
那样仅复制引用)。更改
Page.getPixmap()
、Document.get_page_pixmap()
现在默认为 alpha=False。更改 文本提取:span 字典现在(再次)在 bbox 键下包含其矩形。
更改
Document.movePage()
和Document.copyPage()
使用直接函数代替包装Document.select()
– 类似于 v1.14.16 中的Document.delete_page()
。
版本 1.14.16 中的变化
更改 Document 方法围绕 PDF /EmbeddedFiles,不再使用 MuPDF 的“portfolio”函数。MuPDF v1.15 中将取消此支持,因此需要另一种解决方案。
更改
Document.embfile_Count()
为函数(以前是属性)。新增 方法
Document.embfile_Names()
,返回嵌入文件名的列表。更改
Document.delete_page()
和Document.delete_pages()
内部不再使用Document.select()
,而是使用函数直接执行删除。事实证明,Document.select()
方法对于非常复杂的 PDF 和复杂的注释使用会生成无效的大纲树(目录)。
版本 1.14.15 中的变化
修复 问题 #301 (“线端点和线连接点”)、#300 (“如何绘制无轮廓的形状”) 和 #298 (“utils.updateRect 异常”)。这些错误与使用 PyMuPDF 绘制形状有关。完全支持绘制无边框的形状。线端点样式和线连接点样式现在已区分并支持所有可能的 PDF 值 (0, 1, 2),而不仅仅是布尔值。先前的参数 roundCap 已弃用,转而使用 lineCap 和 lineJoin,并将在下个版本中删除。
修复 问题 #290 (“getText(‘rawDICT’) 内存泄漏”)。此错误导致调用
Page.getText()
的“dict”、“rawdict”和“json”版本后内存未(完全)释放。
版本 1.14.14 中的变化
新增 低级函数
ImageProperties()
,用于确定图像的一系列特征。新增 低级函数
Document.is_stream()
,用于检查对象是否为流类型。更改 低级函数
Document._getXrefString()
和Document._getTrailerString()
现在默认以格式化形式返回对象定义,方便解析。
版本 1.14.13 中的变化
更改 处理二进制输入的方法:除了始终支持 bytes 和 bytearray 对象外,现在也接受 io.BytesIO 输入,使用其 getvalue() 方法。这涉及文档创建、嵌入文件、FileAttachment 注释、pixmap 创建等。修复问题 #274 (“将 BytesIO 作为流用于 insertImage 时出现段错误”)。
修复 问题 #278 (“insertImage(keep_proportion=True) 是否损坏?”)。现在图像在保持纵横比时正确显示。
版本 1.14.12 中的变化
更改 Page 和 Shape 的绘制方法,不仅支持 RGB,还支持 GRAY 和 CMYK 颜色空间。这解决了问题 #270 (“有没有办法使用 CMYK 颜色绘制形状?”)。此更改也适用于 Shape 或 Page 的文本插入方法。
修复 问题 #269 (“Document.insert_page() 中的 AttributeError”),该问题在使用
Document.insert_page()
同时插入文本时发生。
版本 1.14.11 中的变化
更改
Page.show_pdf_page()
,始终将源矩形定位于目标的中心。此方法现在还支持任意角度旋转。参数 reuse_xref 已弃用:内部现已处理重复项的防止。更改
Page.insertImage()
,支持图像的旋转显示和保持纵横比。此处仅支持 90 度倍数的旋转。修复 问题 #265 (“TypeError: insertText() 收到意外关键字参数 ‘idx’”)。此问题仅在使用
Document.insert_page()
同时插入文本时发生。
版本 1.14.10 中的变化
更改
Page.show_pdf_page()
,支持源矩形旋转。修复 #261 (“无法旋转插入的页面”)。修复
Page.insertImage()
中的一个错误,该错误阻止了插入以流形式提供的多个图像。
版本 1.14.9 中的变化
新增 低级方法
Document._getTrailerString()
,返回 PDF 的 trailer 对象。这非常类似于Document._getXrefString()
,除了 PDF trailer 没有/不需要xref
来标识它。新增 文本插入方法的参数。现在可以独立设置字形(文本字符)的描边和填充颜色,以及字形边框的厚度。新的参数 render_mode 控制这些颜色的使用,以及文本是否应该可见。
修复 问题 #258 (“复制图像流到新 PDF 而不增加大小”):对于嵌入在 PDF 中的 JPX 图像,
Document.extractImage()
现在以其原始格式返回它们。以前使用了 MuPDF 基础库,它以 PNG 格式返回它们(导致大小大幅增加)。修复 问题 #259 (“变形文本以适应矩形内”)。澄清了
get_text_length()
的用法,并移除了长单词的额外换行符。
版本 1.14.8 中的变化
新增
Pixmap.set_rect()
,用于更改矩形中的像素值。这也可以用作设置完整 pixmap 颜色的替代方法(Pixmap.clear_with()
)。修复 JBIG2(单色)编码 PDF 图像的提取问题。该问题发生在
Page.getText()
(参数“dict”和“rawdict”)和Document.extractImage()
方法中。修复 未正确清除非 alpha Pixmap 的问题(
Pixmap.clear_with()
)。修复 未正确反转非 alpha Pixmap 颜色的问题(
Pixmap.invert_irect()
)。
版本 1.14.7 中的变化
新增
Pixmap.set_pixel()
,用于更改单个像素值。新增 常见问题 中关于图像转换的文档。
新增 函数
get_text_length()
,用于确定给定字体的字符串长度。新增 Postscript 图像输出(更改了
Pixmap.save()
和Pixmap.tobytes()
)。更改
Pixmap.save()
和Pixmap.tobytes()
,确保颜色空间、alpha 和输出格式的有效组合。更改
Pixmap.save()
:所需格式现在从文件名推断。更改 FreeText 注释现在可以拥有透明背景 - 参阅
Annot.update()
。
版本 1.14.5 中的变化
新增 方法
Pixmap.pixel()
,返回给定像素坐标的像素值(一个列表)。新增 方法
Pixmap.tobytes()
,返回表示 pixmap 的 bytes 对象,支持多种格式。以前只能用于 PNG 输出(Pixmap.tobytes()
)。更改:
Pixmap.save()
和(新的)Pixmap.tobytes()
方法的输出现在也可以是 PSD (Adobe Photoshop Document)。新增 方法
Shape.drawQuad()
,用于绘制一个 Quad。这实际上是使用 quad 边缘的Shape.drawPolyline()
的简写。更改 方法
Shape.drawOval()
:参数现在可以是矩形(rect_like
),也可以是四边形(quad_like
)。
版本 1.14.4 中的变化
修复 问题 #239 “注释坐标一致性”。
版本 1.14.3 中的变化
此补丁版本包含细微错误修复和 CJK 字体输出支持。
新增 支持将四种 CJK 字体作为 PyMuPDF 生成的文本输出。这涉及方法
Page.insertFont()
、Shape.insertText()
、Shape.insertTextbox()
以及相应的 Page 方法。新字体可以通过“保留”字体名称访问:“china-t”(繁体中文)、“china-s”(简体中文)、“japan”(日语)和“korea”(韩语)。新增 对内置字体‘Symbol’和‘Zapfdingbats’的完全支持。
更改:现在可以通过 4 个字母的缩写引用 14 种标准字体。
版本 1.14.1 中的变化
此补丁版本包含细微性能改进。
新增 支持将 pathlib 对象作为 Document 文件名输入,通过使用 Python 的 str() 函数。
版本 1.14.0 中的变化
为了支持 MuPDF v1.14.0,PyMuPDF 进行了大量更改——其中大部分是纯技术性的,对开发者影响不大。但也新增和改进了许多有趣的功能。详情如下
新增 “墨迹”注释。
新增 “图章”注释。
新增 “波浪下划线”文本标记注释。
新增 类 Quad(四边形)——表示平面上的通用四边形。矩形、非空四边形的特殊子类型用于文本标记注释以及文本搜索方法返回的对象。
新增 为
Document.save()
和Document.write()
新增选项“decrypt”。现在保存密码保护的 PDF 时可以保持加密。新增 对底层 C 库 MuPDF 发出的不请自来消息的抑制和重定向。详情参阅 诊断。
更改:对注释的更改现在始终需要
Annot.update()
才能生效。更改 FreeText 注释以支持完整的拉丁字符集和各种外观选项。
更改 文本搜索
Page.searchFor()
,使其可以选择性地返回包围每个搜索结果的 Quad 对象而不是 Rect 对象。更改 纯文本输出:如果每行本身不以该字符结尾,则现在为其添加一个换行符。
修复 问题 211 (“文档中的错误”)。
修复 问题 213 (“重写的大纲仅在基于 MuPDF 的应用程序中显示”)。
修复 问题 214 (“PDF 解密失效!”)。
修复 问题 215 (“使用 PyMuPDF 添加的链接的格式问题”)。
修复 问题 217 (“使用 JSON 提取我的 PDF 时失败”)。
幕后,我们更改了几何对象的实现:它们现在纯粹存在于 Python 中,不再在 C 级别(MuPDF 中)拥有“影子”副本。这使得该领域的处理速度提高了两倍以上。
出于同样的原因,大多数涉及几何参数的方法现在也接受相应的 Python 序列。例如,在方法“page.show_pdf_page(rect, …)”中,参数 rect 现在可以是任何 rect_like
序列。
我们还投入了大量精力进一步扩展和改进常见问题章节。
版本 1.13.19 中的变化
此版本包含一些技术/性能改进和错误修复。
更改 内存管理:对于 Python 3 构建,所有 C 级代码中仅使用 Python 内存管理(即 MuPDF 代码或 PyMuPDF 接口代码中不再使用原生 malloc())。这改进了内存使用状况,也有一些运行时改进:文本提取和 pixmap 创建的运行时缩短了 > 2%(目前仅限 Windows 机器)。
修复 Python 2.7 中使用
TextPage.extractRAWDICT()
(= Page.getText(“rawdict”)) 时发生的错误,导致解释器崩溃。修复 Python 2.7 中创建链接目的地时发生的错误。
扩展 常见问题章节,增加了更多示例。
版本 1.13.18 中的变化
新增 方法
TextPage.extractRAWDICT()
,以及方法Page.getText()
的相应新字符串参数“rawdict”。它以 Python dict 形式从页面提取文本和图像,类似于TextPage.extractDICT()
,但细节级别达到TextPage.extractXML()
的程度,位置信息精确到每个字符。
版本 1.13.17 中的变化
修复
Page.show_pdf_page()
中间歇性导致异常的错误,该错误发生在显示来自许多不同源 PDF 的页面时。更改 方法
Document.extractImage()
现在返回有关提取图像的更多元信息。此外,其性能也得到了显著提高。已更改了几个演示脚本以使用此方法。更改 方法
Document._getXrefStream()
如果对象不是流,现在返回 None,否则不再引发异常。新增 方法
Document._deleteObject()
,用于删除由其xref
标识的 PDF 对象。仅供经验丰富的 PDF 专家使用。新增 方法
paper_rect()
,根据提供的纸张格式字符串返回一个 Rect。示例:fitz.paper_rect(“letter”) = fitz.Rect(0.0, 0.0, 612.0, 792.0)。新增 为本文档新增常见问题章节。
版本 1.13.16 中的变化
新增 支持正确设置某些注释类型的透明度(不透明度)。
新增 工具属性(
Tools.fitz_config
),显示此 PyMuPDF 版本的配置。修复 问题 #193 (‘insertText(overlay=False) 给出“无法调整具有共享存储的缓冲区大小”错误’),通过避免使用只读缓冲区。
版本 1.13.15 中的变化
修复 问题 #189 (“找不到内置 CJK 字体”),现在支持内置 CJK 字体(CJK = 中国、日本、韩国)。这应该能正确生成使用这些语言的文档的 pixmap。此更改对我们的二进制文件大小有影响:现在将在 8 到 10 MB 之间,取决于操作系统。
修复 问题 #191 (“Jupyter Notebook 内核在大约 40 页后崩溃”),该问题在修改注释内容时发生。
版本 1.13.14 中的变化
此补丁版本包含多项改进,主要针对注释。
更改
Annot.lineEnds
现在是两个整数的列表,表示线端符号。以前是字符串的 dict。新增 支持为适用的注释类型添加线端符号。PyMuPDF 现在可以生成包含线端符号的这些注释。
新增
Annot.setLineEnds()
,为适用的注释类型(‘Line’、‘PolyLine’、‘Polygon’)添加线端符号。更改
Page.insertImage()
和Page.show_pdf_page()
的技术实现:它们现在创建自己的 contents 对象,从而避免更改可能较大的流,以及随之而来的压缩/解压缩工作和大量更改带来的增量更新。
版本 1.13.13 中的变化
此补丁版本包含对嵌入文件和文件附件注释的多项改进。
新增
Document.embfile_Upd()
,允许更改嵌入文件的文件内容和元数据。它取代了旧方法Document.embfile_SetInfo()
(该方法将在未来版本中删除)。内容会自动压缩,元数据可以是 unicode。更改
Document.embfile_Add()
,现在会自动压缩文件内容。伴随的元数据现在可以是 unicode(过去必须是 ASCII)。更改
Document.embfile_Del()
,现在会自动删除所有具有提供的标识名称的条目。返回码现在是删除条目的整数计数(以前是 None)。更改 嵌入文件方法,现在也接受或显示 PDF unicode 文件名作为额外参数 ufilename。
新增
Page.add_file_annot()
,添加新的文件附件注释。更改
Annot.fileUpd()
(文件附件注释),现在也接受 PDF unicode 参数 ufilename。描述参数 desc 可以正确处理 unicode。此外,所有参数都是可选的,因此可以在不替换文件内容的情况下更改元数据。更改
Annot.fileInfo()
(文件附件注释),现在也显示 PDF unicode 文件名作为参数 ufilename。修复 问题 #180 (“page.getText(output=’dict’) 返回无效的 bbox”),现在也适用于垂直文本。
修复 问题 #185 (“无法渲染 PyMuPDF 创建的注释”)。问题的原因是 MuPDF 创建注释时采用的极简方法。通过 MuPDF 函数创建时,某些注释类型没有 /AP(“外观”)对象。MuPDF、SumatraPDF 以及 PyMuPDF 无法渲染没有此类对象的注释。此修复现在确保始终与注释本身一起创建一个外观对象。仍不支持线端点样式。
版本 1.13.12 中的变化
修复 问题 #180 (“page.getText(output=’dict’) 返回无效的 bbox”)。请注意,这是对 MuPDF 错误的规避,该错误在某些情况下会生成零高度字符矩形。发生这种情况时,此修复确保 bbox 高度至少为字体大小。
更改 ListBox 和 ComboBox 控件的可选值属性列表已重命名为
Widget.choice_values
。更改 添加控件时,如果缺少 PDF Base 14 字体,会自动将其添加到 PDF 中。控件文本字体现在也可以从现有控件字体中选择。现在会遵循任何指定的域值,并生成具有预设值的域。
新增
Annot.updateWidget()
,允许更改现有表单域——包括域值。
版本 1.13.11 中的变化
虽然之前的补丁子版本仅包含各种修复,此版本再次引入了主要新功能
新增 对 PDF 控件注释的基本支持。现在可以添加 Text、CheckBox、ListBox 和 ComboBox 类型的 PDF 表单域。如有必要,添加第一个控件时,PDF 将转换为表单 PDF。
修复 问题 #176 (“文件嵌入错误”)、#177 (“调用 page.getText() 时发生段错误”) 以及 #179 (“在加密 PDF 上使用 page.getLinks() 时发生段错误”)。
版本 1.13.7 中的变化
新增 对可重排文档(电子书、HTML 等)可变页面大小的支持:在 Document 创建(open)时新增参数 rect 和 fontsize,以及作为单独方法
Document.layout()
。新增 Annot 创建多种注释类型的功能:便签、自由文本、圆形、矩形、直线、多边形、折线和文本标记。
新增 支持注释透明度(
Annot.opacity
、Annot.setOpacity()
)。更改
Annot.vertices
:点坐标现在以浮点数对的形式分组(不再是单独的浮点数)。更改 注释颜色字典:两个键现在命名为“stroke”(以前是“common”)和“fill”。
新增
Document.isDirty
,如果在当前会话中 PDF 已更改,则为 True。每次调用Document.save()
或Document.write()
时重置为 False。
版本 1.13.6 中的变化
修复 #173:对于内存驻留文档,确保流对象在文档关闭前不会被 Python 垃圾回收。
版本 1.13.5 中的变化
更改并扩展了 PDF 表单域支持:属性 widget_text 已重命名为
Annot.widget_value
。现在支持所有表单域类型(签名除外)的值。新增属性Annot.widget_choices
包含列表框和组合框的可选值。如果不存在值,所有这些属性现在都包含 None。
版本 1.13.4 中的变化
Document.convertToPDF()
现在支持页面范围、反转的页面序列和页面旋转。如果文档已经是 PDF,则引发异常。修复了 v1.13.0 引入的一个错误,该错误阻止了
Page.insertImage()
处理透明图像。
版本 1.13.3 中的变化
引入了一种将任何 MuPDF 支持的文档转换为 PDF 的方法。如果您曾想将 XPS、EPUB、CBZ 或 FB2 文件转换为 PDF 版本——这就是一种方法。
Document.convertToPDF()
返回一个 PDF 格式的 Python bytes 对象。可以在 PyMuPDF 中像普通文件一样打开,或者以“.pdf”扩展名写入磁盘。
版本 1.13.2 中的变化
主要增强是 PDF 表单域支持。表单域是类型为 (19, ‘Widget’) 的注释。新增一个文档方法来检查 PDF 是否为表单。 Annot 类新增了描述域详情的属性。
如果对象类型为 /AcroForm 且至少存在一个表单域,则
Document.is_form_pdf
为 true。Annot.widget_type
、Annot.widget_text
和Annot.widget_name
包含表单域(即“Widget”注释)的详细信息。
版本 1.13.1 中的变化
TextPage.extractDICT()
是一个新方法,用于提取文档页面内容(文本和图像)。支持所有文档类型,与其他 TextPage extract*() 方法一样。返回的对象是一个包含嵌套列表和其他字典的字典,与旧方法TextPage.extractJSON()
的 JSON 反序列化结果**完全一致**。区别在于结果是直接创建的——不使用 JSON 模块。由于用户不需要 JSON 模块来解释信息,因此使用更方便,性能也更好,因为它包含原始二进制格式的图像——无需进行 base64 解码。Page.getText()
也相应地支持新参数值“dict”来调用上述方法。TextPage.extractJSON()
(或 Page.getText(“json”))为了方便起见仍然受支持,但预计其使用会减少。
版本 1.13.0 中的变化
此版本基于并需要 MuPDF v1.13.0。此版本“主要是错误修复版本”。
在 PyMuPDF 中,我们也进行了一些错误修复,同时引入了细微增强。对用户 API 的更改非常少。
Document 构造更灵活:新的 filetype 参数允许设置文档类型。如果指定,将忽略文件名的任何扩展名。更全面地解决 问题 #156。作为此项更改的一部分,文档已重写。
- Pixmap 构造器的更改
颜色空间转换不再允许丢弃 alpha 通道:源和目标的 alpha 现在将始终相同。在使用 alpha = 0 时曾出现异常甚至解释器崩溃。
作为替代,简单的 pixmap 复制允许您选择目标 alpha。
Document.save()
再次提供完整的垃圾回收范围 0 到 4。由于xref
维护中的错误,我们不得不暂时强制 garbage > 1。最终解决 问题 #148。Document.save()
现在通过一个额外参数提供了“美化”PDF 源的功能。Page.insertImage()
新增参数 stream,指定存放图像的内存区域。修复了 Linux 系统上 PNG 图像损坏的问题(“Problem writing PNG” #133)。
版本 1.12.4 中的变化
这是对 1.12.3 的扩展。
修复 问题 #147:方法
Document.getPageFontlist()
和Document.getPageImagelist()
现在也显示通过“Form XObjects”嵌套在resources
中的字体和图像。问题 #148 的临时修复:如果给定较低的值,保存到新 PDF 文件时现在会自动使用 garbage = 2。最终修复预计将在 MuPDF 的下一版本中提供。届时我们将移除此规避措施。
预防性修复,解决某些方法中非法使用 stencil / 图像掩码 pixmap 的问题。
方法
Document.getPageFontlist()
现在在列表中包含每个字体的编码名称。方法
Document.getPageImagelist()
现在在列表中包含每个图像的解码方法名称。
版本 1.12.3 中的变化
这是对 1.12.2 的扩展。
许多函数现在返回 None 而不是 0,如果结果除了表示成功执行外没有其他意义(
Document.close()
、Document.save()
、Document.select()
、Pixmap.save()
以及许多其他方法)。
版本 1.12.2 中的变化
这是对 1.12.1 的扩展。
方法
Page.show_pdf_page()
现在接受新的 clip 参数。此参数指定源页面的一个区域,显示将限于该区域。为了方便,新增了
Page.CropBox
和Page.MediaBox
。
版本 1.12.1 中的变化
这是对 1.12.0 版本的扩展。
新增方法
Page.show_pdf_page()
,显示另一个 PDF 的页面。这是一个矢量图像,因此在缩放时保持精确。涉及的两个文档必须是 PDF。新增方法
Page.getSVGimage()
,从页面创建 SVG 图像。与 pixmap 的光栅图像不同,这是一种矢量图像格式。返回结果是一个 unicode 文本字符串,可以保存为 .svg 文件。方法
Page.getTextBlocks()
现在接受一个额外的布尔参数“images”。如果设置为 true(默认值为 false),图像块(仅元数据)将包含在生成的列表中,从而可以检测到渲染图像的区域。细微错误修复。
Page.getText() 的“text”结果现在使用单个空格字符连接块内的所有行。MuPDF 的原始输出改为使用“\n”,这会产生比较参差不齐的输出。
Page 对象的新属性
Page.MediaBoxSize
和Page.CropBoxPosition
提供了关于页面尺寸的更多信息。对于非 PDF 文件(以及大多数 PDF 文件),这些将分别等于Page.rect.bottom_right
和Page.rect.top_left
。例如,类 Shape 利用它们正确放置其项目。
版本 1.12.0 中的变化
此版本基于并需要 MuPDF v1.12.0。新的 MuPDF 版本包含相当多的更改——其中大部分与文本提取相关。部分更改影响了编程 API。
Outline.saveText()
和Outline.saveXML()
已被删除,没有替代方法。无论如何,您可能很少使用它们。但如果您正在寻找替代方法:Document.get_toc()
的输出可以轻松用于生成等效内容。类 TextSheet 已不存在。
文本“span”(TextPage 的一个层级)不再包含位置信息(即没有“bbox”键)。取而代之的是,span 现在提供其文本的字体信息。这会影响我们的 JSON 输出变体。
HTML 输出得到了很大改进:现在创建有效的文档,可以由浏览器显示,产生与原始文档相似的视图。
新增输出格式 XHTML,以浏览器可读格式提供文本和图像。与 HTML 输出的区别在于,不致力于重现原始布局。
Page.getText()
的所有输出格式现在都支持创建完整、有效的文档,通过使用适当的头尾信息包装它们。如果您对使用 HTML 输出感兴趣,请务必阅读 控制 HTML 输出质量。为了支持查找文本位置,我们新增了特殊方法,无需绕道
TextPage.extractJSON()
或TextPage.extractXML()
:使用Page.getTextBlocks()
或Page.getTextWords()
分别创建文本块列表或单词列表,并附带其矩形。这应该比标准文本提取方法快得多,也避免使用额外包来解释其输出。
版本 1.11.2 中的变化
这是对 v1.11.1 的扩展。
新增
Page.insertFont()
,创建一个 PDF /Font 对象并返回其对象编号。新增
Document.extractFont()
,根据给定对象编号提取嵌入字体的内容。方法 FontList(...) 项目不再包含 PDF 生成编号。这个值没有任何意义。取而代之的是,包含了字体文件扩展名(例如,“pfa”表示“PostScript ASCII 字体”),这提供了更有价值的信息。
现在也支持“简单字体”(Type1)以外的字体。
改变 Pixmap 大小的新选项
方法
Pixmap.shrink()
按比例原地缩小 Pixmap。新的 Pixmap 复制构造函数允许通过设置目标宽度和高度来进行缩放。
版本 1.11.1 中的更改
这是 v1.11.0 的扩展。
新类 Shape。它简化并扩展了在 PDF 页面上创建图像形状的功能。它包含多种方法,用于创建基本形状(如线条、矩形或圆形),这些基本形状可以组合成更复杂的形状,并赋予它们共同的属性,如线宽或颜色。组合的形状作为一个单元处理,例如可以“变形”在一起。该类可以累积多个复杂形状,并将它们全部放置在页面的前景或背景中——从而也减少了对页面
contents
对象的更新次数。所有 Page 绘制方法现在都使用新的 Shape 类。
文本插入方法 insertText() 和 insertTextBox() 除了文本旋转外,现在还支持变形。它们已成为 Shape 类的一部分,因此允许文本与图形自由组合。
新的 Pixmap 构造函数允许创建带有附加 alpha 通道的 Pixmap 副本。新方法还允许直接操作 alpha 值。
几何对象(矩阵、矩形和点)的二元代数运算现在通常也支持列表或元组作为第二个操作数。您可以将数字元组 *(x, y)* 添加到 Point 中。在此上下文中,此类序列称为“
point_like
”(分别称为matrix_like
、rect_like
)。几何对象现在完全支持原地运算符。例如,对于数字 *m*,*p /= m* 将点 p 替换为 *p * 1/m*;对于
matrix_like
对象 *m*,则替换为 *p * ~m*。类似地,如果 *r* 是一个矩形,则 *r |= (3, 4)* 是包含 *fitz.Point(3, 4)* 的新矩形,而 *r &= (1, 2, 3, 4)* 是它与 *fitz.Rect(1, 2, 3, 4)* 的交集。
版本 1.11.0 中的更改
此版本基于 MuPDF v1.11 并需要它。
尽管 MuPDF 声明这主要是一个错误修复版本,但确实包含了一个主要新功能:支持嵌入文件——也称为作品集或集合。我们扩展了 PyMuPDF 的功能,使其在这方面稍稍超出了 *mutool* 工具的范围,具体如下。
*Document* 类现在通过几种新方法和一个新属性支持嵌入文件
*embfile_Info()* 返回嵌入文件列表中某个条目的元数据信息。这比 *mutool* 当前提供的信息更多:它显示了用于嵌入文件的所有信息(而不仅仅是条目的名称)。
*embfile_Get()* 将条目的(解压后的)内容检索到 *bytes* 缓冲区中。
*embfile_Add(…)* 将新内容插入到 PDF 作品集中。我们(与 *mutool* 不同)**限制**此操作仅用于具有**新名称**的条目(不允许重复名称)。
*embfile_Del(…)* 从作品集中删除一个条目(MuPDF 中未提供的功能)。
*embfile_SetInfo()* – 更改嵌入文件的文件名或描述。
*embfile_Count* – 包含嵌入文件的数量。
对几何对象进行了一些改进以简化操作。这些改进与新的 MuPDF 版本无关,其中大多数也反映在 PyMuPDF v1.10.0 中。其中包括通过名称标识矩形角点的新属性(例如 *Rect.bottom_right*)以及处理集合论问题(如 *Rect.contains(x)* 或 *IRect.intersects(x)*)的新方法。特别努力集中在支持更多“Pythonic”语言结构上:*if x in rect …* 等同于 *rect.contains(x)*。
Rect 章现在提供了更多关于空矩形和无限矩形以及我们如何处理它们的信息。处理方式本身也已更新,以提高该领域的一致性。
我们已开始对 PDF 内容的**生成**提供基本支持
*Document.insert_page()* 在 PDF 中添加一个新页面,可选地包含一些文本。
*Page.insertImage()* 在 PDF 页面上放置一个新图像。
*Page.insertText()* 在现有页面上放置新文本
对于 **FileAttachment** 注释,可以提取和更改附加文件的内容和名称。
版本 1.10.0 中的更改
MuPDF v1.10 的影响
MuPDF 版本 1.10 对我们的绑定产生了显著影响。其中一些更改也影响了 API – 换句话说,也影响了作为 PyMuPDF 用户的**您**。
链接目标信息已减少。*linkDest* 类的几个属性不再包含有价值的信息。实际上,该类已从 MuPDF 库中整体删除,我们在 PyMuPDF 中仅保留它以提供与现有代码的兼容性。
为了最小化内存需求,MuPDF v1.10 中内置了几项改进
新的 *config.h* 文件可用于在 C 基础代码中取消选择不需要的功能。利用此功能,我们能够将二进制文件 *_fitz.o* / *_fitz.pyd* 的大小减少约 50%(从 9 MB 降至 4.5 MB)。使用 UPX 压缩后,大小进一步降至非常方便的 2.3 MB。
Pixmap 的 alpha(透明度)通道现在是可选的。将 alpha 默认设置为 *False* 可显著减小 Pixmap 大小(CMYK 减少 20%,RGB 减少 25%,GRAY 减少 50%)。因此,许多 *Pixmap* 构造函数现在接受一个 *alpha* 布尔值来控制是否包含此通道。其他 Pixmap 构造函数(例如,用于文件和图像输入的构造函数)创建的 Pixmap 完全没有 alpha 通道。不利的一面是,Pixmap 的保存方法不再接受 *savealpha* 选项:当存在该通道时,它将始终被保存。为了最大程度地减少代码中断,我们保留了调用模式中的此参数——它将被忽略。
*DisplayList* 和 *TextPage* 类构造函数现在**要求引用页面的 mediabox**(即 *page.bound()* 矩形)。无法从其他来源构建此信息,因此在这种情况下无法避免更改源代码。然而,我们假设没有多少用户会明确使用这些相当低级的类。因此,此更改的影响应该很小。
与版本 1.9.3 相比的其他更改
新的 Document 方法 *write()* 将已打开的 PDF 写入内存(与 *save()* 写入文件不同)。
注释现在可以在其页面上进行缩放和移动。这是通过修改其矩形来完成的。
注释现在可以被删除。Page 包含新方法 *deleteAnnot()*。
现在可以修改各种注释属性,例如内容、日期、标题(= 作者)、边框、颜色。
方法 *Document.insert_pdf()* 现在也复制源页面的注释。
*Pages* 类已被删除。由于文档现在可以通过页码作为索引访问(如 *doc[n] = doc.loadPage(n)*),并且文档对象可以用作迭代器,因此维护该类的收益过低。请参见以下评论。
*loadPage(n)* / *doc[n]* 现在接受任意整数来指定页码,只要 *n < pageCount*。因此,例如 *doc[-500]* 总是有效的,并将加载页面 *(-500) % pageCount*。
文档现在也可以用作迭代器,如下所示:*for page in doc: …<对“page”进行操作> …*。这将把 *doc* 的所有页面作为 *page* 生成。
Pixmap 方法 *getSize()* 已被属性 *size* 替换。与以前一样,*Pixmap.size == len(Pixmap)* 为真。
为了响应透明度(alpha)成为可选功能,已向 Pixmap 和 Colorspace 类添加了一些新参数和属性,以支持确定其特征。
Page 类现在包含新属性 *firstAnnot* 和 *firstLink*,用作相应类链的起始点,其中 *firstLink* 只是方法 *loadLinks()* 的助记同义词,该方法继续存在。类似地,新属性 *rect* 是方法 *bound()* 的同义词,该方法也继续存在。
Pixmap 方法 *samplesRGB()* 和 *samplesAlpha()* 已被删除,因为现在可以创建不带透明度的 Pixmap。
Rect 现在有一个属性 *irect*,它是方法 *round()* 的同义词。同样,IRect 现在有一个属性 *rect*,用于返回一个 Rect,其坐标与浮点值相同。
Document 类有一个新方法 *searchPageFor()* 用于搜索文本字符串。它与相应的 *Page.searchFor()* 方法功能完全相同,只是需要额外提供页码参数。
版本 1.9.3 中的更改
此版本同样基于 MuPDF v1.9a。与版本 1.9.2 相比的更改如下:
作为一项主要增强功能,现在以与链接类似的方式支持注释。注释可以显示(作为 pixmap),并且可以访问其属性。
除了文档的 *select()* 方法外,现在还可以使用一些更简单的方法来操作 PDF
*copyPage()* 在文档内复制页面。
*movePage()* 类似,但会删除原始页面。
*delete_page()* 删除页面
*delete_pages()* 删除页面范围
*rotation* 或 *setRotation()* 分别访问或更改 PDF 页面的旋转角度。
之前可用但未记录的 IRect、Rect、Point 和 Matrix 现在支持 *len()* 方法,并且其坐标属性可以通过索引访问,例如 *IRect.x1 == IRect[2]*。
为了方便起见,文档现在支持简单的索引访问:*doc.loadPage(n) == doc[n]*。索引范围可以是 *-pageCount < n < pageCount*,这样 *doc[-1]* 就是文档的最后一页。
版本 1.9.2 中的更改
此版本同样基于 MuPDF v1.9a。与版本 1.9.1 相比的更改如下:
*fitz.open()*(无参数)创建一个新的空 **PDF** 文档,即如果之后保存,必须赋予 *.pdf* 扩展名。
Document 现在接受以下所有格式(*Document* 和 *open* 是同义词)
open(),
*open(filename)*(等同于 *open(filename, None)*),
*open(filetype, area)*(等同于 *open(filetype, stream = area)*)。
内存区域 *stream* 的类型可以是 *bytes* 或 *bytearray*。因此,例如 *area = open(“file.pdf”, “rb”).read()* 可以直接使用(无需先将其转换为 bytearray)。
新方法 *Document.insert_pdf()*(仅限 PDF)插入另一 PDF 中的页面范围。
*Document* 对象 doc 现在支持 *len()* 函数:
len(doc) == doc.pageCount
。新方法 *Document.getPageImageList()* 创建页面上使用的图像列表。
新方法 *Document.getPageFontList()* 创建页面引用的字体列表。
新的 Pixmap 构造函数 *fitz.Pixmap(doc, xref)* 基于已打开的 PDF 文档和图像的
xref
编号创建 pixmap。新的 Pixmap 构造函数 *fitz.Pixmap(cspace, spix)* 创建另一个 pixmap *spix* 的副本,并将其色彩空间转换为 *cspace*。这适用于所有色彩空间组合。
Pixmap 构造函数 *fitz.Pixmap(colorspace, width, height, samples)* 现在允许 *samples* 是 *bytes* 类型,而不仅是 *bytearray*。
版本 1.9.1 中的更改
此版本的 PyMuPDF 基于 MuPDF 库源代码版本 1.9a,发布于 2016 年 4 月 21 日。
请查看 MuPDF 的网站,了解其中包含的更改和增强功能。
版本 1.9.1 与版本 1.8.0 相比的更改如下:
*fitz.Rect* 和 *fitz.IRect* 的新方法 *get_area()*
现在可以使用新的构造函数 *fitz.Pixmap(filename)* 直接从文件创建 Pixmap。
Pixmap 构造函数 *fitz.Pixmap(image)* 已相应扩展。
现在可以使用点和坐标的所有可能组合创建 *fitz.Rect*。
PyMuPDF 类和方法现在都包含 __doc__ 字符串,其中大部分由 SWIG 自动创建。虽然 PyMuPDF 文档肯定更详细,但此功能在支持 Python 的 IDE 中编程时应提供很大帮助。
新的文档方法 *getPermits()* 返回与当前访问文档相关的权限(打印、编辑、注释、复制),形式为 Python 字典。
单位矩阵 *fitz.Identity* 现在是**不可变的**。
新的文档方法 *select(list)* 从文档中删除所有不在列表中的页面。页面也可以复制和重新排列。
我们的演示和示例集合中有各种改进和新成员。也许最突出的是:*PDF_display* 现在支持使用鼠标滚轮滚动,并且有一个新的示例程序 *wxTableExtract*,允许图形化地识别和提取文档中的表格数据。
*fitz.open()* 现在是 *fitz.Document()* 的别名。
新的 pixmap 方法 *tobytes()* 将返回一个格式化为 pixmap PNG 图像的 bytearray。
新的 pixmap 方法 *samplesRGB()* 提供一个剥离了 alpha 字节的 *samples* 版本(仅限 RGB 色彩空间)。
新的 pixmap 方法 *samplesAlpha()* 仅提供 *samples* 区域的 alpha 字节。
文档页面集合上的新迭代器 *fitz.Pages(doc)*。
新的矩阵方法 *invert()*(计算逆矩阵),*concat()*(计算矩阵乘积),*pretranslate()*(执行平移操作)。
新的 *IRect* 方法 *intersect()*(与另一矩形的交集),*translate()*(执行平移操作)。
新的 *Rect* 方法 *intersect()*(与另一矩形的交集),*transform()*(通过矩阵变换),*include_point()*(扩大矩形以包含一个点),*include_rect()*(扩大矩形以包含另一矩形)。
已记录的方法 *Point.transform()*(通过矩阵变换点)。
*Matrix*、*IRect*、*Rect* 和 *Point* 类现在支持紧凑的代数形式来操作这些对象。
现在可以使用调用模式 *doc.save(doc.name, incremental=True)* 进行增量保存更改。
PDF 的元数据现在可以通过文档方法 *set_metadata()* 进行删除、设置或更改。支持增量保存。
PDF 的书签(或目录)现在可以使用文档方法 *set_toc(list)* 通过列表中的条目进行删除、设置或更改。支持增量保存。