如何从 PDF 文件中提取突出显示的部分
Posted
技术标签:
【中文标题】如何从 PDF 文件中提取突出显示的部分【英文标题】:How to extract Highlighted Parts from PDF files 【发布时间】:2012-02-24 08:24:03 【问题描述】:有没有办法以编程方式从 PDF 文件中提取突出显示的文本?欢迎任何语言。我找到了几个包含 Python、Java 和 php 的库,但没有一个能完成这项工作。
【问题讨论】:
感谢您的回答。我还找到了另一种方法来解决这个问题:) 由 Adobe Reader 创建的便签很容易解析,因为便签附加到包含内容和位置信息的 pdf 文件中,但对于高光只有矩形信息我应该按位置提取文本。所以我必须为它写一些代码。作为基础库,我可以使用 PDFMiner,它提供有关文本位置的信息。 听起来相似,但不相关:read, highlight, save PDF programmatically 【参考方案1】:好的,在查看之后,我找到了将突出显示的文本从 pdf 导出到文本文件的解决方案。不是很难:
首先,您使用您喜欢使用的工具突出显示您的文本(在我的例子中,我在 iPad 上使用 Goodreader 应用程序阅读时突出显示)。
将您的 pdf 传输到计算机并使用 Skim(pdf 阅读器,免费且易于在网络上找到)打开它
在 FILE 上,选择 CONVERT NOTES 并将文档的所有注释转换为 SKIM NOTES。
就是这样:只需转到“导出”并选择“导出脱脂注释”。它将为您导出突出显示的文本列表。打开后,此列表可以再次导出为 txt 格式文件。
没有太多工作要做,结果很棒。
【讨论】:
Skim 仅适用于 MAC。是否有 Windows 替代方案?【参考方案2】:要提取突出显示的部分,您可以使用PyMuPDF。这是一个适用于this pdf file的示例:
# Based on https://***.com/a/62859169/562769
from typing import List, Tuple
import fitz # install with 'pip install pymupdf'
def _parse_highlight(annot: fitz.Annot, wordlist: List[Tuple[float, float, float, float, str, int, int, int]]) -> str:
points = annot.vertices
quad_count = int(len(points) / 4)
sentences = []
for i in range(quad_count):
# where the highlighted part is
r = fitz.Quad(points[i * 4 : i * 4 + 4]).rect
words = [w for w in wordlist if fitz.Rect(w[:4]).intersects(r)]
sentences.append(" ".join(w[4] for w in words))
sentence = " ".join(sentences)
return sentence
def handle_page(page):
wordlist = page.getText("words") # list of words on page
wordlist.sort(key=lambda w: (w[3], w[0])) # ascending y, then x
highlights = []
annot = page.firstAnnot
while annot:
if annot.type[0] == 8:
highlights.append(_parse_highlight(annot, wordlist))
annot = annot.next
return highlights
def main(filepath: str) -> List:
doc = fitz.open(filepath)
highlights = []
for page in doc:
highlights += handle_page(page)
return highlights
if __name__ == "__main__":
print(main("PDF-export-example-with-notes.pdf"))
【讨论】:
以上是关于如何从 PDF 文件中提取突出显示的部分的主要内容,如果未能解决你的问题,请参考以下文章
python 以递归方式提取文件夹中所有.pdf文件中的注释和突出显示的段落,并将它们作为具有相同名称的文本文件输出