我在回答其他问题时对 PyMuPDF 进行了一些探索,但我没有个人/实践经验。在这篇文章之前我对 PDFQuery 一无所知。不过,我可以展示我对一个非常基本的示例的看法,即使用 PyMuPDF 根据位置获取一段文本。
另外,您不需要从这些时间推断 PDFQuery 很慢,作者指出这一点在文档中多次:
性能说明:对 pdf.load() 的初始调用运行速度非常慢,因为底层 pdfminer 库必须将页面上的每个元素与其他每个元素进行比较。请参阅缓存部分以避免在后续运行中出现这种情况。
PDFQuery
import pdfquery
query1 = (176.4, 629.28, 176.4, 629.28) # "Text 1" in simple.pdf
pdf = pdfquery.PDFQuery("simple.pdf")
# query1 = (130, 407, 130, 407) # Looking for "Gaussian" in more_complicated.pdf
# pdf = pdfquery.PDFQuery("more_complicated.pdf")
pdf.load(0)
text1 = pdf.pq('LTTextLineHorizontal:overlaps_bbox("%d, %d, %d, %d")' % query1).text()
print(text1)
PyMuPDF
我仍然不确定如何使用 PyMuPDF 最好地完成这项任务,但这里有一种方法至少可以为我提供简单和复杂的目标文本:
from fitz import open as fitz_open, Document, Page, Rect
query1 = Rect(165.6, 165.6, 165.6, 165.6) # "Text 1" in simple.pdf
doc: Document = fitz_open("simple.pdf")
# query1 = Rect(130, 381, 130, 381) # Looking for "Gaussian" in more_complicated.pdf
# doc: Document = fitz_open("more_complicated.pdf")
page: Page = doc.load_page(0)
page_dict: dict = page.get_text("dict")
bbox: Rect # a variable we'll reuse as we work down to our query
text1 = "" # the text we're looking for with query1
block: dict
for block in page_dict["blocks"]:
if block["type"] == 1: # skip, it's an image
continue
bbox = Rect(block["bbox"])
if not bbox.contains(query1):
continue
line: dict
for line in block["lines"]:
bbox = Rect(line["bbox"])
if not bbox.contains(query1):
continue
span: dict
for span in line["spans"]:
bbox = Rect(span["bbox"])
if not bbox.contains(query1):
continue
text1 = span["text"]
print(text1)
Analysis
(您可能已经注意到,PDFQuery 和 PyMuPDF 之间的查询坐标不同,这是因为 PDFQuery 使用bottom-left 作为原点,PyMuPDF 使用upper- 左为原点。)
我还用以下方法测量了运行时间timemacOS 12.4 上的命令; 3次运行的平均值。以下是我针对 simple.pdf 和 more_complicated.pdf 运行 PDFQuery 和 PyMuPDF 的结果:
|
simple.pdf |
more_complicated.pdf |
file |
|
|
PDFQuery timing (s) |
0.123 |
0.258 |
PyMuPDF timing (s) |
0.069 |
0.070 |
PyMuPDF 几乎在同一时间运行两个 PDF,我认为我们看到 PDFQuery 需要更长的时间才能生成这些 PDFn**2/2
交叉比较。
我认为你会放弃很多便利来尝试自己做这件事。如果您的 PDF 是一致的,您可能可以调整 PyMuPDF 并使其正确,但如果它们的创建方式存在差异,则可能需要更长的时间才能正确(如果有的话,因为 PDF 中的文本非常棘手)。