协同工作:DisplayList 和 TextPage#
这里是一些关于如何一起使用这些类的说明。
在某些情况下,回退到此处解释的详细级别可以实现性能提升。
创建 DisplayList#
一个 DisplayList 表示一个已解析的文档页面。用于创建像素图、文本提取和文本搜索的方法——在幕后——都使用页面的显示列表来执行其任务。如果一个页面需要多次渲染(例如因为缩放级别改变),或者如果需要同时执行文本搜索和文本提取,那么如果只创建一次显示列表并在所有其他任务中使用它,则可以节省开销。
>>> dl = page.get_displaylist() # create the display list
您还可以“在列表中”为多个页面创建显示列表,可能在文档打开期间、空闲时间,或者在页面首次被访问时(例如在 GUI 脚本中)存储它。
请注意,对于接下来的一切,只需要显示列表即可——相应的 Page 对象可能已被删除。
生成像素图#
以下代码从 DisplayList 创建一个 Pixmap。参数与 Page.get_pixmap()
的参数相同。
>>> pix = dl.get_pixmap() # create the page's pixmap
此语句的执行时间可能比 Page.get_pixmap()
短至 50%。
执行文本搜索#
使用上面的显示列表,我们还可以搜索文本。
为此,我们需要创建一个 TextPage。
>>> tp = dl.get_textpage() # display list from above
>>> rlist = tp.search("needle") # look up "needle" locations
>>> for r in rlist: # work with the found locations, e.g.
pix.invert_irect(r.irect) # invert colors in the rectangles
提取文本#
使用上面的同一个 TextPage 对象,我们现在可以立即使用任意或所有 5 种文本提取方法。
注意
上面,我们在没有参数的情况下创建了文本页面。这导致默认参数为 3(保留 ligatures
和空白),因此不会提取图像——请参见下文。
>>> txt = tp.extractText() # plain text format
>>> json = tp.extractJSON() # json format
>>> html = tp.extractHTML() # HTML format
>>> xml = tp.extractXML() # XML format
>>> xml = tp.extractXHTML() # XHTML format
进一步的性能提升#
像素图#
正如 Page 章中所解释的
如果您不需要透明度,在创建像素图时将 alpha = 0。这将节省 25% 的内存(如果是 RGB,这是最常见的情况),并可能节省 5% 的执行时间(取决于 GUI 软件)。
TextPage#
如果您不需要提取页面文本的同时提取图像,可以设置以下选项
>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE
>>> tp = dl.get_textpage(flags)
这将为 HTML、XHTML 和 JSON 文本提取节省大约 25% 的总执行时间,并且如果文档是图形导向的,将大幅减少存储空间(内存和磁盘空间)。
但是,如果您确实需要图像,请将 flags 的值设置为 7
>>> flags = pymupdf.TEXT_PRESERVE_LIGATURES | pymupdf.TEXT_PRESERVE_WHITESPACE | pymupdf.TEXT_PRESERVE_IMAGES