Читайте PDF постранично
Я искал свой вопрос и не получил ответ на два доступных вопроса
В основном я хочу перебирать каждую страницу, потому что я хочу выбрать только ту страницу, которая имеет определенный текст.
я использовал pyPdf
, Это работает почти, я могу сказать, что 90% pdfs
но иногда он не извлекает информацию со страницы.
Я использовал следующий код:
import pyPdf
extract = ""
pdf = pyPdf.PdfFileReader(open('filename.pdf', "rb"))
num_of_pages = pdf.getNumPages()
for p in range(num_of_pages):
ex = pdf.getPage(6)
ex = ex.extractText()
if re.search(r"to be held (at|on)",ex.lower()):
print 'yes'
print ex ,"\n"
extract = extract + ex + "\n"
continue
Приведенный выше код работает, но иногда некоторые страницы не извлекаются.
Я также пытался использовать pdfminer
, но я не мог найти, как перебрать pdf в нем постранично. pdfminer
возвращает весь текст PDF.
Я использовал следующий код:
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
В приведенном выше коде текст из PDF приходит с for
петля
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
В этом, как я могу повторить на одной странице за раз.
Документация по pdfminer
не понятно. Также есть много версий того же самого.
Так есть ли другие пакеты, доступные для моего вопроса или может pdfminer
быть использованы для этого?
4 ответа
Я знаю, что не стоит отвечать на ваш собственный вопрос, но я думаю, что, возможно, нашел ответ на этот вопрос.
Я думаю, что это не лучший способ сделать это, но все же это помогает мне.
Я использовал комбинацию pypdf
а также pdfminer
Код как ниже:
import pyPdf
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
path = "filename.pdf"
pdf = pyPdf.PdfFileReader(open(path, "rb"))
fp = file(path, 'rb')
num_of_pages = pdf.getNumPages()
extract = ""
for i in range(num_of_pages):
inside = [i]
pagenos=set(inside)
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
text = ""
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
text = text.decode("ascii","replace")
if re.search(r"to be held (at|on)",text.lower()):
print text
extract = extract + text + "\n"
continue
Возможно, есть лучший способ сделать это, но в настоящее время я обнаружил, что это довольно хорошо.
Поскольку retstr сохранит каждую страницу, вы можете подумать об изменении кода, вызвав retstr.truncate(0), который очищает строку каждый раз, в противном случае вы печатаете все, что уже прочитано каждый раз:
import pyPdf
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
path = "filename.pdf"
pdf = pyPdf.PdfFileReader(open(path, "rb"))
fp = file(path, 'rb')
num_of_pages = pdf.getNumPages()
extract = ""
for i in range(num_of_pages):
inside = [i]
pagenos=set(inside)
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
text = ""
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
retstr.truncate(0)
text = text.decode("ascii","replace")
if re.search(r"to be held (at|on)",text.lower()):
print text
extract = extract + text + "\n"
continue
Вы можете обратиться к следующей ссылке для извлечения постраничного текста из PDF.
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages("test.pdf"):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())
У меня та же проблема, но для меня я хочу сделать цикл по многим файлам и извлечь только в файле excel «partenaire», у которого есть конкретное слово/выражение после поиска только на первой странице pdf. Моя первая проблема - сделать цикл в папке и файле PDF. Вот мой код на данный момент:
{
enter code here
path_extraction_folder = "C:/Users/xxxxx/yyyyyy/pdf"
list_path = glob.glob(path_extraction_folder+"/**/*.pdf",recursive=True)
cpt = 0
for path in list_path:
path_base = "/".join(str(path).replace("\\","/").split("/")[:-1])
new_path = os.path.join(path_base, str(cpt)+".pdf")
os.rename(path, new_path)
cpt +=1
partenaires = [x.split("\\")[1] for x in list_path]
type_doc = [x.split("\\")[2] for x in list_path]
nom_fichier = [x.split("\\")[-1] for x in list_path]
df_files = pd.DataFrame()
df_files["partenaire"] = partenaires
df_files["nom dossier"] = type_doc
df_files["nom fichier"] = nom_fichier
df_files.to_excel("./files-tree_.xlsx",index=False)
df_files = pd.read_excel("./files-tree_.xlsx")
df_files["partenaire"] = df_files["partenaire"].apply(lambda x :
str(x).rjust(14,'0'))
#Here is my issue, I want to do a loop on the 'partenaire' of my df_file but idk
#how
path = file_path
pdf = pyPdf.PdfFileReader(open(path, "rb"))
fp = file(path, 'rb')
num_of_pages = pdf.getNumPages()
extract = ""
for i in range(num_of_pages):
inside = [i]
pagenos=set(inside)
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
text = ""
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,
password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
text = text.decode("ascii","replace")
if re.search(r"PLAN D'EPARGNE EN ACTIONS|PLAN D'EPARGNE EN
ACTIONS)",text.lower()):
print text
extract = extract + text + "\n"
continue
}