Читайте PDF постранично

Я искал свой вопрос и не получил ответ на два доступных вопроса

  1. Извлечь текст на страницу с помощью Python pdfMiner?

  2. PDFMiner - перебирая страницы и переводя их в текст

В основном я хочу перебирать каждую страницу, потому что я хочу выбрать только ту страницу, которая имеет определенный текст.

я использовал 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())

PDFMiner Постраничное извлечение текста страницы

У меня та же проблема, но для меня я хочу сделать цикл по многим файлам и извлечь только в файле 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

}

Другие вопросы по тегам