Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to extract Highlighted Parts from PDF files

Is there any way to extract highlighted text from a PDF file programmatically? Any language is welcome. I have found several libraries with Python, Java, and also PHP but none of them do the job.

like image 981
user1183057 Avatar asked Feb 01 '12 16:02

user1183057


People also ask

Can you copy only highlighted text in PDF?

Yes, it is possible, but there is a caveat: before you begin highlighting, you have to enable a feature called Copy Selected text into Highlight, Strikethrough, and Underline comment pop-ups. It's in the File | Preferences | Commenting menu.

How do I export highlighted PDF to Excel?

1 Correct answer. Yes, it is, in a way. Enable the option to copy the selected text into the highlight (under Edit - Preferences - Commenting) and then you can use the Create Comments Summary command to export the commented text as a new PDF, which you can then export to Excel.


2 Answers

To extract highlighted parts, you can use PyMuPDF. Here is an example which works with this pdf file:

# Based on https://stackoverflow.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"))
like image 144
Martin Thoma Avatar answered Sep 26 '22 02:09

Martin Thoma


Ok, after looking I found a solution for exporting highlighted text from a pdf to a text file. Is not very hard:

  1. First, you highlight your text with the tool you like to use (in my case, I highlight while I'm reading on an iPad using Goodreader app).

  2. Transfer your pdf to a computer and open it using Skim (a pdf reader, free and easy to find on the web)

  3. On FILE, choose CONVERT NOTES and convert all the notes of your document to SKIM NOTES.

  4. That's all: simply go to EXPORT an choose EXPORT SKIM NOTES. It will export you a list of your highlighted text. Once opened this list can be exported again to a txt format file.

Not much work to do, and the result is fantastic.

like image 36
Angel Avatar answered Sep 24 '22 02:09

Angel