Как использовать pdfminer в качестве библиотеки

Я пытаюсь получить текстовые данные из PDF-файла с помощью pdfminer. Я могу успешно извлечь эти данные в файл .txt с помощью инструмента командной строки pdf2txt.py. В настоящее время я делаю это, а затем использую скрипт Python для очистки файла .txt. Я хотел бы включить в скрипт процесс извлечения PDF-файлов и сэкономить один шаг.

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

Я также попробовал функцию, показанную здесь, но она тоже не сработала. работать.

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

Я использую Python версии 2.7.1 и pdfminer версии 20110227.


person jmeich    schedule 20.04.2011    source источник
comment
Вы пробовали это?   -  person Rafe Kettler    schedule 20.04.2011
comment
Я просмотрел api, спасибо, но, к сожалению, мои навыки Python недостаточно сильны, чтобы получить рабочую функцию.   -  person jmeich    schedule 20.04.2011
comment
Вы можете найти это решение аналогичного вопроса полезным: stackoverflow.com/a/61857301/7483211   -  person Cornelius Roemer    schedule 19.05.2020


Ответы (15)


Вот очищенная версия, которую я, наконец, создал, и она сработала для меня. Следующее просто возвращает строку в PDF-файле с учетом его имени файла. Надеюсь, это сэкономит кому-то время.

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

def convert_pdf(path):

    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)

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

    str = retstr.getvalue()
    retstr.close()
    return str

Это решение действовало до изменений API в ноябре 2013 г..

person karpathy    schedule 30.11.2011
comment
К вашему сведению, это больше не работает в текущей версии pdfminer - я получаю ImportError: невозможно импортировать имя process_pdf - person scubbo; 12.12.2013
comment
вот рабочее решение: stackoverflow.com/questions/26494211/ (по состоянию на середину ноября 2015 г.) - person benzkji; 16.11.2015
comment
process_pdf был просто заменен PDFPageInterpreter - person Ando Jurai; 07.02.2019
comment
StringIO также исчез, и вместо этого вы можете использовать из io import StringIO - person moli; 07.03.2020

Вот новое решение, которое работает с последней версией:

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO 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)
    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return str
person czw    schedule 03.01.2014
comment
большой! наконец, работающее решение без использования process_pdf :) Я пробовал это с simple1.pdf из официальный репозиторий git - person Michael; 08.01.2014
comment
Это работает для версии pdfminer 20131113. Спасибо. - person AfromanJ; 28.01.2014
comment
@czw. Как вы используете это со встроенными опциями? Есть ли способ указать номер страницы для преобразования? - person jason; 05.07.2014
comment
если вы хотите получить html-вывод, просто добавьте HTMLConverter к импорту и в функции, вместо TextConverter поставьте HTMLConverter. Просто как тот. - person OWADVL; 14.08.2014
comment
Вы молодец, он также работает с последней версией pdfminer (20140328): import pdfminer print pdfminer .__ version__ 20140328 - person Abdul Majeed; 14.10.2014
comment
Отлично с одним незначительным изменением: НЕ используйте str в качестве имени переменной. str - это функция Python. - person ViennaMike; 06.06.2015
comment
Я получаю ImportError: No module named pdfpage - person Andi Giga; 20.06.2016

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

Я последовал предложению в одной из ссылок, опубликованных в моем вопросе, и изменил назначение текущего скрипта pdf2txt.py, включенного в pdfminer. Вот функция на тот случай, если она кому-то пригодится. Спасибо пользователю skyl за публикацию этого ответа, все, что мне нужно было сделать, это внести пару изменений, чтобы он работал с текущей версией pdfminer.

Эта функция берет файл PDF и создает файл .txt в том же каталоге с тем же именем.

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

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

# debug option
debug = 0
# input option
password = ''
pagenos = set()
maxpages = 0
# output option
# ?outfile = None
# ?outtype = None
outdir = None
#layoutmode = 'normal'
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 == '-V': laparams.detect_vertical = True
    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 == '-F': laparams.boxes_flow = float(v)
    elif k == '-Y': layoutmode = v
    elif k == '-O': outdir = v
    elif k == '-t': outtype = v
    elif k == '-c': codec = v
    elif k == '-s': scale = float(v)
#
#PDFDocument.debug = debug
#PDFParser.debug = debug
CMapDB.debug = debug
PDFResourceManager.debug = debug
PDFPageInterpreter.debug = debug
PDFDevice.debug = debug
#
rsrcmgr = PDFResourceManager()

outtype = 'text'

if outfile:
    outfp = file(outfile, 'w')
else:
    outfp = sys.stdout
device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)


fp = file(path, 'rb')
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password,
                check_extractable=True)
fp.close()
device.close()
outfp.close()
return
person jmeich    schedule 20.04.2011
comment
это нормально, если вы ответите на свои вопросы, не волнуйтесь. - person oers; 20.04.2011
comment
Я также перепрофилировал этот код. Это могло быть немного тоньше - person Jesvin Jose; 29.07.2011
comment
Вполне желательно ответить на свой вопрос по той причине, которую вы указали - person disc0dancer; 18.04.2012

У меня это сработало, используя самую последнюю версию pdfminer (по состоянию на сентябрь 2014 г.):

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
import unicodedata, codecs
from io import StringIO

def getPDFText(pdfFilenamePath):
    retstr = StringIO()
    parser = PDFParser(open(pdfFilenamePath,'r'))
    try:
        document = PDFDocument(parser)
    except Exception as e:
        print(pdfFilenamePath,'is not a readable pdf')
        return ''
    if document.is_extractable:
        rsrcmgr = PDFResourceManager()
        device = TextConverter(rsrcmgr,retstr, codec='ascii' , laparams = LAParams())
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        for page in PDFPage.create_pages(document):
            interpreter.process_page(page)
        return retstr.getvalue()
    else:
        print(pdfFilenamePath,"Warning: could not extract text from pdf file.")
        return ''

if __name__ == '__main__':
    words = getPDFText(path)
person Jorge    schedule 14.10.2014
comment
что делать, если он говорит, что PDF-файл не читается? - person Harsh Vardhan; 15.02.2021

Вот мое решение

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
import os 

def convert_pdf_to_txt(path, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)
    output = StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(path, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close()
    return text

Например, вы просто хотите прочитать первые 3 страницы файла pdf:

text = convert_pdf_to_txt('../Data/EN-FINAL Table 9.pdf', pages=[0,1,2])

pdfminer.six == 20160614

питон: 3.x

person Community    schedule 10.02.2017
comment
Отлично! Это сработало для меня. Python 3.6.2 pdfminer.six - person PJATX; 24.09.2018
comment
Лучшее решение под Python 3.6 / pdfminer.six / Windows 7 - person Peter; 02.11.2018
comment
Привет. это возвращает строку, подобную этой для моего pdf. '(cid: 42) (cid: 82) (cid: 89) (cid: 72) (cid: 85) (cid: 81) (cid: 80) (cid: 72) (cid: 81) (cid: 87 ) (cid: 3) (cid: 57) (cid: 72) (cid: 75) (cid: 76) (cid: 70) (cid: 79) (cid: 72) (cid: 86) \ n \ n (cid: 20) (cid: 25) (cid: 18) (cid: 19) (cid: 2id: 87) (cid: 86) (cid: 15) (cid: 3) (cid: 37) (cid: 79) ' - person Harsh Vardhan; 15.02.2021

Вот ответ, который работает с pdfminer.six запущенным python 3.6. Он использует модуль pdfminer.high_level, который абстрагирует большую часть основных деталей, если вы просто хотите получить необработанный текст из простого файла PDF.

import pdfminer
import io

def extract_raw_text(pdf_filename):
    output = io.StringIO()
    laparams = pdfminer.layout.LAParams() # Using the defaults seems to work fine

    with open(pdf_filename, "rb") as pdffile:
        pdfminer.high_level.extract_text_to_fp(pdffile, output, laparams=laparams)

    return output.getvalue()
person Dave Potts    schedule 11.10.2017

Следующая модификация ответов non-process_pdf извлекает текст прямо из имени строки URL и работает с версией 20140328 и Python 2.7:

from urllib2 import urlopen
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
def convert_pdf_to_txt(url):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)

    scrape = urlopen(url).read()
    fp = StringIO(scrape)

    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)

    fp.close()
    device.close()
    textstr = retstr.getvalue()
    retstr.close()
    return textstr
person ds58    schedule 17.06.2014

Если вы работаете с очищенными данными через urllib2, попробуйте следующее (разработанное и объясненное здесь):

def pdf_to_text(scraped_pdf_data): 
    from pdfminer.pdfinterp import PDFResourceManager, process_pdf 
    from pdfminer.pdfdevice import PDFDevice 
    from pdfminer.converter import TextConverter 
    from pdfminer.layout import LAParams 

    import StringIO 
    fp = StringIO.StringIO() 
    fp.write(scraped_pdf_data) 
    fp.seek(0) 
    outfp = StringIO.StringIO() 

    rsrcmgr = PDFResourceManager() 
    device = TextConverter(rsrcmgr, outfp, laparams=LAParams()) 
    process_pdf(rsrcmgr, device, fp) 
    device.close() 

    t = outfp.getvalue() 
    outfp.close() 
    fp.close() 
    return t

Как и другие ответы, код здесь адаптирует утилиту pdf2txt, которую предоставляет сам PDFMiner. Таким образом, вы также можете конвертировать в HTML или XML - просто sub HTMLConverter или XMLConverter для TextConverter везде выше.

person scharfmn    schedule 17.09.2012

Следующий код работает для меня с последней версией PDFMiner, он принимает путь к pdf и возвращает текст в формате .txt.

P.S: Это модификация вышеприведенного ответа.

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

def convert_pdf_to_txt(path, outtype='txt'):
    outfile = path[:-3] + outtype
    rsrcmgr = PDFResourceManager()
    codec = 'utf-8'
    laparams = LAParams()
    if outfile:
        outfp = file(outfile, 'w')
    else:
        outfp = sys.stdout
    device = TextConverter(rsrcmgr, outfp, 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)
    fp.close()
    device.close()
    outfp.close()
    return
person Waqas Javed    schedule 18.06.2014

на всякий случай, если кому-то это еще нужно, он работает с запросами и python 3.4. спасибо @bahmait за его ответ выше :)

import requests

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


def pdf_to_text(url=None):
    text = None
    pdf = requests.get(url)

    if pdf.ok:
        fp = StringIO(str(pdf.content, 'utf-8'))
        outfp = StringIO()

        rsrcmgr = PDFResourceManager()
        device = TextConverter(rsrcmgr, outfp, laparams=LAParams())
        process_pdf(rsrcmgr, device, fp)
        device.close()

        text = outfp.getvalue()
        outfp.close()
        fp.close()
    return text


if __name__ == "__main__":
    hello_world_text = pdf_to_text("https://bytebucket.org/hsoft/pdfminer3k/raw/28edfc91caed830674ca0b928f42571f7dee6091/samples/simple1.pdf")
    no_pdf = pdf_to_text('http://www.google.com/404')
    print(hello_world_text)
    print(no_pdf)
person djmm187    schedule 03.01.2015
comment
Вы попробовали этого парня? [ссылка] pypi.python.org/pypi/pdfminer3k ... не похоже, что это действительно поддерживаются больше, но это дало мне хорошую точку опоры. В конце концов, я использовал их модуль pdf2txt, смешав несколько методов из pypdf2 для моего конкретного случая использования. - person djmm187; 15.05.2015

Вот очищенная версия, которую я, наконец, создал, и она сработала для меня. Следующее просто возвращает строку в PDF-файле с учетом его имени файла. Надеюсь, это сэкономит кому-то время.

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

def convert_pdf(path):

    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)

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

    str = retstr.getvalue()
    retstr.close()
    return str

Кто-нибудь может сказать мне: есть ли какое-то конкретное место, где должен быть помещен файл pdf ??

person Gourab Mahapatra    schedule 29.05.2013

Только если кому-то это еще нужно: Как распечатать HTML из PDF с помощью PDFMiner:

import sys
import getopt
from Core.Interfaces.IReader import IReader
from pdfminer.pdfparser import PDFDocument, PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter, process_pdf
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams
from cStringIO import StringIO

class PdfReader(object):
def __init__(self):
    pass

def readText(self,path, outtype='text', opts={}):
    outfile = path[:-3] + outtype
    outdir = '/'.join(path.split('/')[:-1])
    # debug option
    debug = 0
    # input option
    password = ''
    pagenos = set()
    maxpages = 0
    # output option
    # ?outfile = None
    # ?outtype = None
    outdir = None
    #layoutmode = 'normal'
    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 == '-V': laparams.detect_vertical = True
        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 == '-F': laparams.boxes_flow = float(v)
        elif k == '-Y': layoutmode = v
        elif k == '-O': outdir = v
        elif k == '-t': outtype = v
        elif k == '-c': codec = v
        elif k == '-s': scale = float(v)

    print laparams
    #
    #PDFDocument.debug = debug
    #PDFParser.debug = debug
    CMapDB.debug = debug
    PDFResourceManager.debug = debug
    PDFPageInterpreter.debug = debug
    PDFDevice.debug = debug
    #
    rsrcmgr = PDFResourceManager()

    #outtype = 'text'

    outfp = StringIO()

    device = HTMLConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)


    fp = file(path, 'rb')
    process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password,
                    check_extractable=True)
    fp.close()
    device.close()
    print outfp.getvalue()
    outfp.close()

    return



reader = PdfReader()
opt = map(None,['-W','-L','-t'],[0.5,0.4,'html'])
reader.readText("/test_data/test.pdf","html",opt)
person atGuz    schedule 08.09.2014

Этот работал у меня на python 3. Для этого требуется пакет PDFMiner.six.

pip install pdfminer.six

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

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from six 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 = open(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)
    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()

    return str.replace("\\n","\n")
person Carlos B    schedule 21.02.2019

Полное раскрытие информации, я являюсь одним из сопровождающих pdfminer.six.

В настоящее время существует несколько API для извлечения текста из PDF, в зависимости от ваших потребностей. За кулисами все эти api используют одну и ту же логику для синтаксического анализа и анализа макета.

(Во всех примерах предполагается, что ваш PDF-файл называется example.pdf)

Командная строка

Если вы хотите извлечь текст только один раз, вы можете использовать инструмент командной строки pdf2txt.py:

$ pdf2txt.py example.pdf

API высокого уровня

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

from pdfminer.high_level import extract_text

text = extract_text('example.pdf')

Составной API

Также существует составной API, который дает большую гибкость в обработке результирующих объектов. Например, вы можете реализовать свой собственный алгоритм компоновки, используя это. Этот метод предлагается в других ответах, но я бы рекомендовал его только тогда, когда вам нужно настроить поведение pdfminer.six.

from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('example.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

print(output_string.getvalue())
person Pieter    schedule 21.12.2020

Следующие ниже фрагменты кода позволяют извлекать простой текст из PDF-документов с помощью последней версии pdfminer (по состоянию на 23 марта 2016 г.). Надеюсь это поможет.

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO 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')

    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    parser.set_document(doc)

    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()
    print text
    return text

convert_pdf_to_txt(<path_of_the_pdf_file>)
person Abhishek Kumar    schedule 23.03.2016