it-swarm.com.ru

Извлечение текста из PDF с использованием Python и Pypdf2

Я хочу извлечь текст из файла PDF, используя пакет Python и PYPDF . Это мой pdf fie, и это мой код:

import PyPDF2
opened_pdf = PyPDF2.PdfFileReader('test.pdf', 'rb')

p=opened_pdf.getPage(0)

p_text= p.extractText()
# extract data line by line
P_lines=p_text.splitlines()
print P_lines

Моя проблема в том, что P_lines не может извлекать данные построчно и приводит к одной гигантской строке. Я хочу извлечь текст построчно, чтобы проанализировать его. Любое предложение о том, как его улучшить? Спасибо! Эта строка возвращает код:

[Необязательная информация о химических веществах, подпадающих под действие 29 CFR 1910.1200 (i) и Приложение D можно получить из паспортов безопасности материалов (MSDS) ** Информация основана на максимальном потенциале для концентрация и, следовательно, общее количество может превышать 100% * Общий объем воды источники могут включать в себя пресную воду, производимую воду и/или переработанную water0.01271% 72,00% 7732-18-5Water0.00071% 4,00% 1310-73-2Sodium Hydroxide0.00424% 24,00% 533-74-4DazomatBiocidePumpcoPlexcide 24L0,00828% 75,00% Органическая фосфоновая кислота соли 0,00276% 25,00% 67-56-1Метиловый спирт Ингибитор накипи.PumpcoPlexaid 6730,00807% 30,00% 7732-18-5Вод0,00188% 7,00% Поверхностно-активные вещества на основе полиэтоксилированного спирта0,00753% 28,00% 9003-06-9Аммоний Соли0,00941% 35,00% 64742-47-8Перегонка нефтиТрение ReducerPumpcoPlexslick 9210,05029% 60,00% 7732-18-5Вода0,03353% 40,00% 7647-01-0Хлористоводородная кислотаГидрохлоридная кислотаPumpcoHCL9,84261% 100,00% 14808-60-7Кристаллин SilicaProppantPumpcoSand90.01799% 100.00% 7732-18-5WaterCommentsMaximumIngredientConcentrationin HF Жидкость (% по массе) ** Максимальная концентрация ингредиента Концентрация в добавке (% от Массы) ** Химический номер службы абстрактного обслуживания (CAS #) Объем воды (галлон) *: 7,595Трутика по вертикали Глубина (TVD): GasProduction Тип: NAD27Long/Lat Проекция: 32.558525Широта: -97.215242Длина: Ole Gieser Unit D 6Ну имя и номер: Имя оператора XTO Energy: 42-439-35084API Номер: TarrantСтрана: TexasState: 12/10/2010Fracture DateHydraulic Раскрытие информации о компоненте продукта ГРП »]

Скриншот файла:  enter image description here

3
Amir
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

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
print(convert_pdf_to_txt('test.pdf').strip().split('\n\n'))

Результат

Раскрытие информации о компонентах продукта гидравлического разрыва жидкости

Дата перелома Штат: Уезд: Номер API: Имя оператора: Название скважины и Номер: Долгота: Широта: Долгота/Шир Проекция: Тип производства: Истинная вертикальная глубина (TVD): общий объем воды (галлон) *:

10/10/2010 Texas Tarrant 42-439-35084 XTO Energy Ole Gieser Unit D 6H -97,215242 32,558525 NAD27 Газ 7,595 2,608,032

Состав гидравлического разрыва пласта:

Торговое наименование

Поставщик

Цель

Ингредиенты

Номер химической аннотации

(CAS #)

Максимальный ингредиент

Концентрация

в добавке (по массе) **

Комментарии

Максимальный ингредиент

Концентрация

в HF жидкости (по массе) **

Водный песок HCL

Pumpco Pumpco

Проппант соляная кислота

Plexslick 921

Pumpco

Редуктор трения

Плекса 673

Pumpco

Ингибитор солеотложений

Plexcide 24L

Pumpco

Biocide

Кристаллический кремнезем

Вода хлористого водорода

Нефтяной дистиллят Соли аммония Полиэтоксилированный спирт ПАВ Вода

Метиловый спирт Органические соли фосфоновой кислоты

Дазомат Натрий Гидроксид Вода

7732-18-5 14808-60-7

7647-01-0 7732-18-5

64742-47-8 9003-06-9

7732-18-5

67-56-1

533-74-4 1310-73-2 7732-18-5

100,00 100,00

90,01799 9,84261

40,00 60,00

35.00 28,00 7,00 30,00

25.00 75,00

24,00 4.00 72,00

0,03353 0,05029

0,00941 0,00753 0,00188 0,00807

0,00276 0,00828

0,00424 0,00071 0,01271

  • Источники общего объема воды могут включать в себя пресную, добытую и/или оборотную воду ** Информация основана на максимальном потенциале концентрации и, следовательно, общее количество может превышать 100

Информация об ингредиентах для химических веществ, подпадающих под 29 CFR 1910.1200 (i) и Приложение D можно получить из паспортов безопасности материалов (Паспорт безопасности)

2
SmartManoj

Убедитесь, что в импортируемом PDF действительно есть переводы строки. Если этого не произойдет, то p_text.splitlines() нигде не будет разбивать строку! Если есть определенный символ, вы можете использовать p_text.split("the linebreak character").

Правка: Исходя из вашего PDF, я не уверен, что есть способ разбить это на строку, так как кажется, что он статически отформатирован, а не линейно. (текст размещается по позиции в PDF, а не построчно).

0
OldBunny2800

Вот функция, которую я придумал, которая была полностью основана на ответе @SmartManoj, но была обновлена, чтобы быть более чистой (на мой взгляд) с помощью операторов with, исключая ненужные переменные (то есть те, которые объясняет ключевой аргумент self), а также получая текст страницы.

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def pages_as_txt(path) -> Generator[str, None, None]:
    rsrcmgr = PDFResourceManager()
    with StringIO() as retstr, TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams()) as device:
        interpreter = PDFPageInterpreter(rsrcmgr, device)

        with open(path, 'rb') as fp:
            for page in PDFPage.get_pages(fp, check_extractable=False):
                interpreter.process_page(page)
                yield retstr.getvalue()
                retstr.truncate(0)
                retstr.seek(0)
0
Matt M.