如何从 PDF 文件中提取突出显示的部分

Posted

技术标签:

【中文标题】如何从 PDF 文件中提取突出显示的部分【英文标题】:How to extract Highlighted Parts from PDF files 【发布时间】:2012-02-24 08:24:03 【问题描述】:

有没有办法以编程方式从 PDF 文件中提取突出显示的文本?欢迎任何语言。我找到了几个包含 Python、Java 和 php 的库,但没有一个能完成这项工作。

【问题讨论】:

感谢您的回答。我还找到了另一种方法来解决这个问题:) 由 Adob​​e 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文件中的注释和突出显示的段落,并将它们作为具有相同名称的文本文件输出

如何从 MS Word 文档中选择性地提取以黄色突出显示的文本?

如何使用 PDFJS 突出显示文本?

如何使用 PDFKit 突出显示 pdf 中的选定文本?

如何在Nodejs的pdftron中保存注释?

使用 iTextSharp 突出显示文本减少对 PDF 文件大小的影响