日志记录#

从版本 1.19.0 开始,更新 PDF 文档时可以进行日志记录。

日志记录是一种允许对PDF进行还原重新应用更改的记录机制。类似于现代数据库系统中的LUWs“逻辑工作单元”,可以将一组更新归为一个“操作”。在MuPDF日志记录中,一个操作充当LUW的角色。

注意

与数据库系统中发现的LUW实现相比,MuPDF的日志记录发生在每个文档级别。不支持同时更新多个PDF:必须在这里建立自己的逻辑。

  • journalling 必须通过文档方法 启用。journalling 对于现有或新文档都是可能的。journalling 只能通过 关闭文件来禁用。

  • 启用后,所有更改必须在一个 操作 内发生 – 否则将引发异常。操作通过文档方法开始和停止。在这两个调用之间发生的更新形成一个 LUW,因此可以共同回滚或重新应用,或在 MuPDF 术语中“撤销”或“重做”。

  • 在任何时候,都可以查询日志记录状态:日志记录是否处于活动状态,已记录的操作数量,是否可以“撤销”或“重做”,当前在日志中的位置等。

  • 该期刊可以保存到文件中加载。这些是文档方法。

  • 加载期刊文件时,会检查与文档的兼容性,并在成功时自动启用记录。

  • 对于一个现有的 PDF 文档进行记录时,有一种特殊的新保存方法可用:Document.save_snapshot()。这执行了一种特殊的增量保存,包括到目前为止所有已记录的更新。如果它的记录同时被保存(在文档快照之后立即),那么文档和记录是同步的,可以稍后一起使用以撤销或重做操作,或者继续进行记录的更新——就像没有中断一样。

  • 快照 PDF 在各个方面都是有效的 PDF,并且完全可用。如果文档在没有使用其日志文件的情况下以任何方式被更改,则会发生不同步,日志将变得不可用。

  • 快照文件的结构像增量更新。然而,内部日志记录逻辑要求,保存 必须发生到一个新文件。因此,用户应该制定一个文件命名约定,以支持原始PDF与其快照集之间可识别的关系,例如 original.pdforiginal-snap1.pdf / original-snap1.logoriginal-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
    

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