Goal: if pdf line contains sub-string, then copy entire sentence (across multiple lines).
I am able to print()
the line
the phrase
appears in.
Now, once I find this line
, I want to go back iterations, until I find a sentence terminator: . ! ?
, from the previous sentence, and iterate forward again until the next sentence terminator.
This is so as I can print()
the entire sentence the phrase belongs in.
Jupyter Notebook:
# pip install PyPDF2
# pip install pdfplumber
# ---
# import re
import glob
import PyPDF2
import pdfplumber
# ---
phrase = "Responsible Care Company"
# SENTENCE_REGEX = re.pattern('^[A-Z][^?!.]*[?.!]$')
def scrape_sentence(sentence, lines, index):
if '.' in lines[index] or '!' in lines[index] or '?' in lines[index]:
return sentence.replace('\n', '').strip()
sentence = scrape_sentence(lines[index-1] + sentence, lines, index-1) # previous line
sentence = scrape_sentence(sentence + lines[index+1], lines, index+1) #
following line
return sentence
# ---
with pdfplumber.open('../data/gri/reports/GPIC_Sustainability_Report_2020__-_40_Years_of_Sustainable_Success.pdf') as opened_pdf:
for page in opened_pdf.pages:
text = page.extract_text()
lines = text.split('\n')
i = 0
sentence = ''
while i < len(lines):
if 'and Knowledge of Individuals; Behaviours; Attitudes, Perception ' in lines[i]:
sentence = scrape_sentence('', lines, i) # !
print(sentence) # !
i += 1
Output:
connection and the linkage to the relevant UN’s 17 SDGs.and Leadership. We have long realized and recognized that there
Phrase:
Responsible Care Company
Sentence (across multiple lines):
"GPIC is a Responsible Care Company certified for RC 14001
since July 2010."
I have been working on "back-tracking" iterations, based on this solution. I did try a for-loop
, but it doesn't let you back back iterations.
Please let me know if there is anything else I can add to post.
I have a working version. However, this does not account for multiple columns of text from a
.pdf
page.See here for a discussion related to that.
Example .pdf
Jupyter Notebook:
Output: