Модуль Python для преобразования PDF в текст [закрыт]

Каковы лучшие модули Python для преобразования файлов PDF в текст?

25.08.2008 04:44:06
Я искал подобное решение. Мне просто нужно прочитать текст из файла PDF. Мне не нужны изображения. pdfminer - хороший выбор, но я не нашел простого примера того, как извлечь текст. Наконец я получил этот SO-ответ ( stackoverflow.com/questions/5725278/… ) и теперь использую его.
Nayan 2.03.2016 08:43:57
Поскольку вопрос был закрыт, я разместил его на Stack Exchange, посвященном рекомендациям по программному обеспечению, на тот случай, если кто-то захочет написать новый ответ: модуль Python для преобразования PDF в текст
Franck Dernoncourt 28.04.2017 02:47:23
Единственное решение, которое сработало для меня для контента UTF-8: Apache Tika
Shoham 4.03.2018 20:41:06
Я хотел бы обновить список доступных опций для преобразования PDF в текст в Python, GroupDocs.Conversion Cloud SDK для Python преобразует PDF в текст точно.
Tilal Ahmad 25.10.2019 14:02:59
13 ОТВЕТОВ
РЕШЕНИЕ

Попробуйте PDFMiner . Он может извлекать текст из файлов PDF в формате HTML, SGML или «Tagged PDF».

Формат PDF с тегами кажется самым чистым, а удаление тегов XML оставляет только пустой текст.

Версия Python 3 доступна в разделе:

140
1.06.2019 03:12:27
Я только добавил ответ, описывающий, как использовать pdfminer в качестве библиотеки.
codeape 24.11.2008 14:21:13
нет поддержки Python 3 :(
Karl Adler 19.12.2014 16:13:12
Ответ, который я привел в этой теме, может быть полезен для людей, которые смотрят на этот ответ и задаются вопросом, как использовать библиотеку. Я привожу пример того, как использовать библиотеку PDFMiner для извлечения текста из PDF. Поскольку документация немного скудна, я подумал, что это может помочь нескольким людям.
DuckPuncher 13.02.2015 16:56:56
Denis Cornehl 4.12.2015 10:10:18
Пример кода на stackoverflow.com/a/26495057/125617
Renaud 6.01.2016 21:38:40

PDFminer дал мне, возможно, одну строку [страница 1 из 7 ...] на каждую страницу файла PDF, который я пробовал с ним.

Лучший ответ, который у меня есть, это pdftoipe или код на c ++, основанный на Xpdf.

Посмотрите мой вопрос о том, как выглядит вывод pdftoipe.

1
23.05.2017 12:34:45

Pdftotext Программа с открытым исходным кодом (часть Xpdf), которую вы можете вызывать из python (не то, что вы просили, но может быть полезно). Я использовал это без проблем. Я думаю, что Google использует его в Google Desktop.

47
28.08.2008 09:46:53
Похоже, это наиболее полезный из перечисленных здесь инструментов, с -layoutвозможностью сохранить текст в том же положении, что и в PDF. Теперь, если бы я только мог понять, как передать содержимое PDF в него.
Matthew Schinckel 31.05.2012 06:00:51
После тестирования нескольких решений это кажется самым простым и надежным вариантом. Может быть легко упакован Python, используя временный файл, чтобы определить, куда записывается вывод.
Cerin 29.10.2012 15:14:35
Конечно , используйте «-» в качестве имени файла, чтобы перенаправить вывод на стандартный вывод. Таким образом, вы можете использовать простой subprocess.check_output, и этот вызов будет выглядеть как внутренняя функция.
Ctrl-C 15.07.2014 08:55:06
Просто чтобы усилить действия тех, кто его использует. , , pdftotextкажется, работает очень хорошо, но ему нужен второй аргумент, который является дефисом, если вы хотите увидеть результаты на stdout.
Gordon Linoff 2.06.2015 15:53:21
Это преобразует рекурсивно все PDF-файлы, начиная с текущей папки: find . -iname "*.pdf" -exec pdftotext -enc UTF-8 -eol unix -raw {} \;по умолчанию сгенерированные файлы имеют исходное имя с .txtрасширением.
ccpizza 10.03.2017 19:03:58

pyPDF работает нормально (при условии, что вы работаете с правильно сформированными PDF-файлами). Если вам нужен только текст (с пробелами), вы можете просто сделать:

import pyPdf
pdf = pyPdf.PdfFileReader(open(filename, "rb"))
for page in pdf.pages:
    print page.extractText()

Вы также можете легко получить доступ к метаданным, данным изображения и так далее.

Комментарий в примечаниях к коду extractText:

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

Является ли это проблемой, зависит от того, что вы делаете с текстом (например, если порядок не имеет значения, это нормально, или если генератор добавляет текст в поток в порядке, в котором он будет отображаться, это нормально) , У меня есть код извлечения pyPdf в повседневном использовании, без каких-либо проблем.

41
7.09.2008 04:47:09
нет поддержки Unicode :(
PanosJee 14.10.2010 10:30:56
pyPdf поддерживает UTF сейчас.
lbolla 18.10.2012 16:19:15
Эта библиотека выглядит как мусор. Тестирование на случайном PDF дает мне ошибку «pyPdf.utils.PdfReadError: Маркер EOF не найден»
Cerin 29.10.2012 14:59:04
Из вопроса: в сгенерированном тексте не было пробела, и он был бесполезен . Я использовал pyPDF и получил тот же результат - текст извлекается без пробелов между словами.
Jordan Reiter 3.12.2012 17:45:15
Когда я выполняю функцию page.extractText (), я получаю сообщение об ошибке «TypeError: Невозможно неявно преобразовать объект« bytes »в str». Как с этим справиться?
juankysmith 11.11.2013 09:55:51

Кроме того, существует PDFTextStream - коммерческая библиотека Java, которую также можно использовать из Python.

1
12.11.2008 17:08:47

Вы также можете довольно легко использовать pdfminer в качестве библиотеки. У вас есть доступ к модели содержимого PDF, и вы можете создать свой собственный текст извлечения. Я сделал это, чтобы преобразовать содержимое PDF в текст, разделенный точкой с запятой, используя код ниже.

Функция просто сортирует объекты содержимого TextItem в соответствии с их координатами y и x и выводит элементы с той же координатой y, что и в одной текстовой строке, разделяя объекты на одной строке с помощью ';' символы.

Используя этот подход, я смог извлечь текст из PDF-файла, из которого другой инструмент не смог извлечь контент, пригодный для дальнейшего анализа. Другие инструменты, которые я пробовал, включают pdftotext, ps2ascii и онлайн-инструмент pdftextonline.com.

pdfminer - это бесценный инструмент для pdf-соскоба.


def pdf_to_csv(filename):
    from pdflib.page import TextItem, TextConverter
    from pdflib.pdfparser import PDFDocument, PDFParser
    from pdflib.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, TextItem):
                    (_,_,x,y) = child.bbox
                    line = lines[int(-y)]
                    line[x] = child.text

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, "ascii")

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(doc, fp)
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

ОБНОВЛЕНИЕ :

Код выше написан на старой версии API, см. Мой комментарий ниже.

21
25.07.2011 06:05:07
Какие плагины вам нужны для этого, приятель? Я скачал и установил pdfminer, но этого недостаточно ...
kxk 24.07.2011 17:38:08
Код выше написан против старой версии PDFminer. API изменился в более поздних версиях (например, пакет сейчас pdfminer, нет pdflib). Я предлагаю вам взглянуть на источник pdf2txt.pyв источнике PDFminer, приведенный выше код был вдохновлен старой версией этого файла.
codeape 25.07.2011 06:04:14

Пакет PDFMiner изменился с момента публикации Codeape .

РЕДАКТИРОВАТЬ (снова):

PDFMiner был снова обновлен в версии 20100213

Вы можете проверить установленную версию со следующим:

>>> import pdfminer
>>> pdfminer.__version__
'20100213'

Вот обновленная версия (с комментариями о том, что я изменил / добавил):

def pdf_to_csv(filename):
    from cStringIO import StringIO  #<-- added so you can copy/paste this to try it
    from pdfminer.converter import LTTextItem, TextConverter
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTTextItem):
                    (_,_,x,y) = child.bbox                   #<-- changed
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)  #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8")  #<-- changed 
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       #<-- changed
    parser.set_document(doc)     #<-- added
    doc.set_parser(parser)       #<-- added
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

Изменить (еще раз):

Вот обновление для последней версии в PyPI , 20100619p1. Короче я заменил LTTextItemс LTCharи передал экземпляр LAParams конструктору CsvConverter.

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter    #<-- changed
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item.objs:
                if isinstance(child, LTChar):               #<-- changed
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child.text.encode(self.codec)

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())  #<-- changed
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()

РЕДАКТИРОВАТЬ (еще раз):

Обновлено для версии 20110515(спасибо Oeufcoque Penteano!):

def pdf_to_csv(filename):
    from cStringIO import StringIO  
    from pdfminer.converter import LTChar, TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

    class CsvConverter(TextConverter):
        def __init__(self, *args, **kwargs):
            TextConverter.__init__(self, *args, **kwargs)

        def end_page(self, i):
            from collections import defaultdict
            lines = defaultdict(lambda : {})
            for child in self.cur_item._objs:                #<-- changed
                if isinstance(child, LTChar):
                    (_,_,x,y) = child.bbox                   
                    line = lines[int(-y)]
                    line[x] = child._text.encode(self.codec) #<-- changed

            for y in sorted(lines.keys()):
                line = lines[y]
                self.outfp.write(";".join(line[x] for x in sorted(line.keys())))
                self.outfp.write("\n")

    # ... the following part of the code is a remix of the 
    # convert() function in the pdfminer/tools/pdf2text module
    rsrc = PDFResourceManager()
    outfp = StringIO()
    device = CsvConverter(rsrc, outfp, codec="utf-8", laparams=LAParams())
        # becuase my test documents are utf-8 (note: utf-8 is the default codec)

    doc = PDFDocument()
    fp = open(filename, 'rb')
    parser = PDFParser(fp)       
    parser.set_document(doc)     
    doc.set_parser(parser)       
    doc.initialize('')

    interpreter = PDFPageInterpreter(rsrc, device)

    for i, page in enumerate(doc.get_pages()):
        outfp.write("START PAGE %d\n" % i)
        if page is not None:
            interpreter.process_page(page)
        outfp.write("END PAGE %d\n" % i)

    device.close()
    fp.close()

    return outfp.getvalue()
136
23.05.2017 10:31:37
В [6]: импорт pdfminer. В [7]: pdfminer .__ version__ Out [7]: '20100424'. В [8]: из pdfminer.converter. Импорт LTTextItem. LTContainer LTLine LTRect LTTextGroup LITERAL_DEVICE_RGB LTНастройка LTPage LTText LTTextLine
Skylar Saveland 17.07.2010 22:41:09
@skyl, код выше для предыдущей версии '20100213'. Из списка изменений на их сайте, похоже, они изменились LTTextItemна LTChar. unixuser.org/~euske/python/pdfminer/index.html#changes
tgray 19.07.2010 13:17:15
@ Oeufcoque Penteano, спасибо! Я добавил еще один раздел в ответ для версии 20110515за ваш комментарий.
tgray 25.06.2013 19:10:27
Ответ, данный @ user3272884, работает с 5-1-2014
jmunsch 2.05.2014 04:15:21
Я должен был решить эту же проблему сегодня, немного изменил код tgray для извлечения информации о пробелах, разместил его здесь
tarikki 29.04.2016 10:28:48

Повторное использование кода pdf2txt.py, который поставляется с pdfminer; вы можете создать функцию, которая будет указывать путь к pdf; опционально, outtype (txt | html | xml | tag) и выбирает как командную строку pdf2txt {'-o': '/path/to/outfile.txt' ...}. По умолчанию вы можете позвонить:

convert_pdf(path)

Будет создан текстовый файл, родной файл в файловой системе с оригинальным pdf.

def convert_pdf(path, outtype='txt', opts={}):
    import sys
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
    from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, TagExtractor
    from pdfminer.layout import LAParams
    from pdfminer.pdfparser import PDFDocument, PDFParser
    from pdfminer.pdfdevice import PDFDevice
    from pdfminer.cmapdb import CMapDB

    outfile = path[:-3] + outtype
    outdir = '/'.join(path.split('/')[:-1])

    debug = 0
    # input option
    password = ''
    pagenos = set()
    maxpages = 0
    # output option
    codec = 'utf-8'
    pageno = 1
    scale = 1
    showpageno = True
    laparams = LAParams()
    for (k, v) in opts:
        if k == '-d': debug += 1
        elif k == '-p': pagenos.update( int(x)-1 for x in v.split(',') )
        elif k == '-m': maxpages = int(v)
        elif k == '-P': password = v
        elif k == '-o': outfile = v
        elif k == '-n': laparams = None
        elif k == '-A': laparams.all_texts = True
        elif k == '-D': laparams.writing_mode = v
        elif k == '-M': laparams.char_margin = float(v)
        elif k == '-L': laparams.line_margin = float(v)
        elif k == '-W': laparams.word_margin = float(v)
        elif k == '-O': outdir = v
        elif k == '-t': outtype = v
        elif k == '-c': codec = v
        elif k == '-s': scale = float(v)
    #
    CMapDB.debug = debug
    PDFResourceManager.debug = debug
    PDFDocument.debug = debug
    PDFParser.debug = debug
    PDFPageInterpreter.debug = debug
    PDFDevice.debug = debug
    #
    rsrcmgr = PDFResourceManager()
    if not outtype:
        outtype = 'txt'
        if outfile:
            if outfile.endswith('.htm') or outfile.endswith('.html'):
                outtype = 'html'
            elif outfile.endswith('.xml'):
                outtype = 'xml'
            elif outfile.endswith('.tag'):
                outtype = 'tag'
    if outfile:
        outfp = file(outfile, 'w')
    else:
        outfp = sys.stdout
    if outtype == 'txt':
        device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)
    elif outtype == 'xml':
        device = XMLConverter(rsrcmgr, outfp, codec=codec, laparams=laparams, outdir=outdir)
    elif outtype == 'html':
        device = HTMLConverter(rsrcmgr, outfp, codec=codec, scale=scale, laparams=laparams, outdir=outdir)
    elif outtype == 'tag':
        device = TagExtractor(rsrcmgr, outfp, codec=codec)
    else:
        return usage()

    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password)
    fp.close()
    device.close()

    outfp.close()
    return
6
18.07.2010 19:17:56

Я использовал pdftohtmlс -xmlаргументом, прочитайте результат с subprocess.Popen(), который даст вам координаты x, координаты y, ширину, высоту и шрифт каждого фрагмента текста в pdf. Я думаю, это то, что «evince», вероятно, использует тоже, потому что выдают те же сообщения об ошибках.

Если вам нужно обрабатывать столбчатые данные, они становятся немного сложнее, так как вам нужно изобрести алгоритм, который подходит вашему PDF-файлу. Проблема в том, что программы, которые создают файлы PDF, не обязательно выкладывают текст в любом логическом формате. Вы можете попробовать простые алгоритмы сортировки, и иногда это работает, но могут быть небольшие «отставшие» и «отклоняющиеся» фрагменты текста, которые не будут расположены в том порядке, в котором вы думали. Таким образом, вы должны стать творческими.

У меня ушло около 5 часов, чтобы найти один из тех PDF-файлов, над которыми я работал. Но это работает довольно хорошо сейчас. Удачи.

1
1.06.2019 03:14:44

Нашел это решение сегодня. Прекрасно работает для меня. Даже рендеринг страниц PDF в изображения PNG. http://www.swftools.org/gfx_tutorial.html

0
31.01.2011 00:22:57

slate это проект, который позволяет очень просто использовать PDFMiner из библиотеки:

>>> with open('example.pdf') as f:
...    doc = slate.PDF(f)
...
>>> doc
[..., ..., ...]
>>> doc[1]
'Text from page 2...'   
17
31.01.2011 00:27:17
Я получаю сообщение об ошибке импорта при выполнении команды "import slate": {File "C: \ Python33 \ lib \ site-packages \ slate-0.3-py3.3.egg \ slate_ init_ .py", строка 48, в <module> ImportError: невозможно импортировать имя PDF} Но класс PDF есть! Ты знаешь как это решить?
juankysmith 11.11.2013 10:14:18
Нет, это звучит очень странно. У вас есть зависимости?
Tim McNamara 11.11.2013 16:50:27
Обычно я получаю сообщения о пропущенных зависимостях, в этом случае я получаю классическое сообщение «Файл импорта сланца» C: \ Python33 \ lib \ site-packages \ slate-0.3-py3.3.egg \ slate_ init_ .py ", строка 48 , в <module> ImportError: невозможно импортировать имя PDF "
juankysmith 12.11.2013 07:42:31
Согласно Slate 0.3 требуется pdfminer 20110515, согласно этому выпуску GitHub
jabbett 7.11.2014 16:04:55
Этот пакет больше не поддерживается. Воздержитесь от его использования. Вы даже не можете использовать его в Python 3.5
Sivasubramaniam Arunachalam 6.01.2017 15:32:23

Мне нужно было конвертировать определенный PDF в обычный текст в модуле Python. Я использовал PDFMiner 20110515, прочитав их инструмент pdf2txt.py , я написал этот простой фрагмент:

from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams

def to_txt(pdf_path):
    input_ = file(pdf_path, 'rb')
    output = StringIO()

    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    process_pdf(manager, converter, input_)

    return output.getvalue() 
8
28.10.2013 16:46:27
def to_txt (pdf_path):
Cătălin George Feștilă 25.10.2013 09:58:14
если бы я хотел конвертировать только определенное количество страниц, как бы я сделал это с этим кодом?
psychok7 3.04.2014 08:18:38
@ psychok7 Вы пробовали использовать инструмент pdf2txt? Похоже, что эта функция поддерживается в текущей версии с флагом -p, реализация, кажется, проста для отслеживания и должна быть легкой в ​​настройке: github.com/euske/pdfminer/blob/master/tools/pdf2txt.py Надеюсь, это поможет! :)
gonz 3.04.2014 19:45:20
спасибо @gonz, я пробовал все вышеперечисленное, но твое решение оказалось идеальным для меня, выход с пробелами :)
lazarus 14.04.2015 06:30:13
pdf2txt.py установлен здесь для меня:C:\Python27\Scripts\pdfminer\tools\pdf2txt.py
The Red Pea 14.09.2015 20:52:06

Поскольку ни одно из этих решений не поддерживает последнюю версию PDFMiner, я написал простое решение, которое будет возвращать текст PDF с использованием PDFMiner. Это будет работать для тех, кто получает ошибки импорта сprocess_pdf

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
from cStringIO import StringIO

def pdfparser(data):

    fp = file(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print data

if __name__ == '__main__':
    pdfparser(sys.argv[1])  

Ниже приведен код, который работает для Python 3:

import sys
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.layout import LAParams
import io

def pdfparser(data):

    fp = open(data, 'rb')
    rsrcmgr = PDFResourceManager()
    retstr = io.StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    # Create a PDF interpreter object.
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    # Process each page contained in the document.

    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
        data =  retstr.getvalue()

    print(data)

if __name__ == '__main__':
    pdfparser(sys.argv[1])  
65
3.10.2017 08:42:29
это первый фрагмент, который я обнаружил, который на самом деле работает со странными PDF-файлами (особенно с бесплатными электронными книгами, которые можно получить из packtpub). Любой другой кусок кода просто возвращает странно закодированный сырой материал, но ваш на самом деле возвращает текст. Спасибо!
somada141 30.01.2016 01:42:42
Возможно, вы захотите выполнить retstr.seek (0) после получения данных, или вы будете накапливать текст со всех страниц.
Tshirtman 1.03.2017 18:01:07
Чтобы использовать с python3, помимо очевидных скобок после printкоманды, нужно заменить fileкоманду на openи импортировать StringIOиз пакетаio
McLawrence 3.07.2017 15:34:01
Вау. Этот блок отлично работал в первый раз, когда я его скопировал. Удивительно! На разборе и исправлении данных и не нужно напрягаться из-за ввода.
SecsAndCyber 7.07.2017 01:18:33
pdfminer не работает для python3. этот код не работает для pdfminer3k
thang 15.09.2017 18:50:48