日志记录#
从版本 1.19.0 开始,更新 PDF 文档时可以进行日志记录。
日志记录是一种允许对PDF进行还原或重新应用更改的记录机制。类似于现代数据库系统中的LUWs“逻辑工作单元”,可以将一组更新归为一个“操作”。在MuPDF日志记录中,一个操作充当LUW的角色。
注意
与数据库系统中发现的LUW实现相比,MuPDF的日志记录发生在每个文档级别。不支持同时更新多个PDF:必须在这里建立自己的逻辑。
journalling 必须通过文档方法 启用。journalling 对于现有或新文档都是可能的。journalling 只能通过 关闭文件来禁用。
启用后,所有更改必须在一个 操作 内发生 – 否则将引发异常。操作通过文档方法开始和停止。在这两个调用之间发生的更新形成一个 LUW,因此可以共同回滚或重新应用,或在 MuPDF 术语中“撤销”或“重做”。
在任何时候,都可以查询日志记录状态:日志记录是否处于活动状态,已记录的操作数量,是否可以“撤销”或“重做”,当前在日志中的位置等。
该期刊可以保存到或从文件中加载。这些是文档方法。
加载期刊文件时,会检查与文档的兼容性,并在成功时自动启用记录。
对于一个现有的 PDF 文档进行记录时,有一种特殊的新保存方法可用:
Document.save_snapshot()。这执行了一种特殊的增量保存,包括到目前为止所有已记录的更新。如果它的记录同时被保存(在文档快照之后立即),那么文档和记录是同步的,可以稍后一起使用以撤销或重做操作,或者继续进行记录的更新——就像没有中断一样。快照 PDF 在各个方面都是有效的 PDF,并且完全可用。如果文档在没有使用其日志文件的情况下以任何方式被更改,则会发生不同步,日志将变得不可用。
快照文件的结构像增量更新。然而,内部日志记录逻辑要求,保存 必须发生到一个新文件。因此,用户应该制定一个文件命名约定,以支持原始PDF与其快照集之间可识别的关系,例如
original.pdf和original-snap1.pdf/original-snap1.log,original-snap2.pdf/original-snap2.log,等等。
示例会话 1#
描述:
创建一个新的PDF并启用日志功能。然后添加一页和一些文本行 – 每个操作都是单独进行的。
在期刊中导航,撤销和重做这些更新,并显示状态和文件结果:
>>> import pymupdf >>> doc=pymupdf.open() >>> doc.journal_enable() >>> # try update without an operation: >>> page = doc.new_page() mupdf: No journalling operation started ... omitted lines RuntimeError: No journalling operation started >>> doc.journal_start_op("op1") >>> page = doc.new_page() >>> doc.journal_stop_op() >>> doc.journal_start_op("op2") >>> page.insert_text((100,100), "Line 1") >>> doc.journal_stop_op() >>> doc.journal_start_op("op3") >>> page.insert_text((100,120), "Line 2") >>> doc.journal_stop_op() >>> doc.journal_start_op("op4") >>> page.insert_text((100,140), "Line 3") >>> doc.journal_stop_op() >>> # show position in journal >>> doc.journal_position() (4, 4) >>> # 4 operations recorded - positioned at bottom >>> # what can we do? >>> doc.journal_can_do() {'undo': True, 'redo': False} >>> # currently only undos are possible. Print page content: >>> print(page.get_text()) Line 1 Line 2 Line 3 >>> # undo last insert: >>> doc.journal_undo() >>> # show combined status again: >>> doc.journal_position();doc.journal_can_do() (3, 4) {'undo': True, 'redo': True} >>> print(page.get_text()) Line 1 Line 2 >>> # our position is now second to last >>> # last text insertion was reverted >>> # but we can redo / move forward as well: >>> doc.journal_redo() >>> # our combined status: >>> doc.journal_position();doc.journal_can_do() (4, 4) {'undo': True, 'redo': False} >>> print(page.get_text()) Line 1 Line 2 Line 3 >>> # line 3 has appeared again!
示例会话 2#
描述:
与之前类似,但在撤销了一些操作后,我们现在添加了一个不同的更新。这将导致:
永久删除未完成的日记条目
新的更新操作将成为新的最后条目。
>>> doc=pymupdf.open() >>> doc.journal_enable() >>> doc.journal_start_op("Page insert") >>> page=doc.new_page() >>> doc.journal_stop_op() >>> for i in range(5): doc.journal_start_op("insert-%i" % i) page.insert_text((100, 100 + 20*i), "text line %i" %i) doc.journal_stop_op()
>>> # combined status info: >>> doc.journal_position();doc.journal_can_do() (6, 6) {'undo': True, 'redo': False}
>>> for i in range(3): # revert last three operations doc.journal_undo() >>> doc.journal_position();doc.journal_can_do() (3, 6) {'undo': True, 'redo': True}
>>> # now do a different update: >>> doc.journal_start_op("Draw some line") >>> page.draw_line((100,150), (300,150)) Point(300.0, 150.0) >>> doc.journal_stop_op() >>> doc.journal_position();doc.journal_can_do() (4, 4) {'undo': True, 'redo': False}
>>> # this has changed the journal: >>> # previous last 3 text line operations were removed, and >>> # we have only 4 operations: drawing the line is the new last one