Pdfreader библиотеки Pythons для извлечения PDF не будет выполнять итерацию по страницам

#python #pdf

Вопрос:

Я хочу извлечь текст из PDF-файла с помощью библиотеки Python под названием pdfreader. Я следовал инструкциям здесь:

https://pdfreader.readthedocs.io/en/latest/tutorial.html#how-to-browse-document-pages

Это мой код:

 import requests
from io import StringIO, BytesIO
from pdfreader import SimplePDFViewer, PDFDocument

pdf_links = ['https://www.buelach.ch/fileadmin/files/documents/Finanzen/Finanz-_und_Aufgabenplan_2020-2024_2020-09-14.pdf',
             'https://www.buelach.ch/fileadmin/files/documents/Finanzen/201214_budget2021_aenderungen_gr.pdf',
             'http://www.dielsdorf.ch/dl.php/de/5e8c284c3b694/2020.04.06.pdf',
             'http://www.dielsdorf.ch/dl.php/de/5f17e472ca9f1/2020.07.20.pdf']

for pdf_link in pdf_links:

    response = requests.get(pdf_link)
    my_raw_data = response.content


    #extract text page by page
    with BytesIO(my_raw_data) as data:
        
        viewer = SimplePDFViewer(data)
        full_pdf_text = ''

        total_page_num = len(list(viewer))
        for i, page in enumerate(viewer):
            text = page.strings
            text = "".join(text)
            text = text.strip().replace('     ', 'nn').strip()
            text = text.replace('  ', 'nn')
            print('PAGE', i)
 

Код не выдает мне никаких ошибок, но проблема в том, что он не повторяется по страницам.
Переменная total_page_num возвращает мне количество страниц (более 1), но когда я вхожу в цикл, она всегда переходит только на одну страницу (только на первую страницу).

Ответ №1:

Для решения этой проблемы потребовалось много чтения документации для pdfreader модуля Python. Я был потрясен уровнем сложности использования этого модуля для простого извлечения текста. Потребовалось несколько часов, чтобы найти рабочее решение.

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

Я отметил, что в одном из ваших PDF-файлов возникла проблема с кодировкой некоторых шрифтов во время синтаксического анализа, что приводит к появлению предупреждающего сообщения.

 import requests
from io import BytesIO
from pdfreader import SimplePDFViewer

pdf_links = [
    'https://www.buelach.ch/fileadmin/files/documents/Finanzen/Finanz-_und_Aufgabenplan_2020-2024_2020-09-14.pdf',
    'https://www.buelach.ch/fileadmin/files/documents/Finanzen/201214_budget2021_aenderungen_gr.pdf',
    'http://www.dielsdorf.ch/dl.php/de/5e8c284c3b694/2020.04.06.pdf',
    'http://www.dielsdorf.ch/dl.php/de/5f17e472ca9f1/2020.07.20.pdf']

for pdf_link in pdf_links:

    response = requests.get(pdf_link, stream=True)

    # extract text page by page
    with BytesIO(response.content) as data:

        viewer = SimplePDFViewer(data)

        all_pages = [p for p in viewer.doc.pages()]
        number_of_pages = len(all_pages)
        for page_number in range(1, number_of_pages   1):
            viewer.navigate(int(page_number))
            viewer.render()
            page_strings = " ".join(viewer.canvas.strings).replace('     ', 'nn').strip()
            print(f'Current Page Number: {page_number}')
            print(f'Page Text: {page_strings}')
 

Комментарии:

1. Я начал получать эту ошибку: github.com/maxpmaxp/pdfreader/issues/77 , вы знаете, в чем может быть проблема? Ошибка: Нет такого файла или каталога: ‘/usr/local/lib/python3.7/dist-пакеты/pdfreader/кодеки/cmaps/Identity-H’

2. Я хочу развернуть это на AWS lambdas

3. Развертывание этой AWS-лямбды было бы интересно. Как вы планируете очистить(обойти) URL-адреса для всех ваших источников? Где вы планируете разместить выход всей добычи?