2014-10-22 2 views
1

Я пытаюсь извлечь текст из pdf с помощью Python. Для этого я нашел pdfminer, который делает довольно хорошую работу, используя pdf2txt.py command line tool следующим образом:Как заставить этот метод Python возвращать строку вместо того, чтобы записывать ее в stdout?

kramer65 $ pdf2txt.py myfile.pdf 
all the text contents 
of the pdf 
are printed out here.. 

Потому что я хочу, чтобы использовать эту функцию в моей программе, я хочу использовать это в качестве модуля, а не в командной строке инструмент. Таким образом, мне удалось настроить файл pdf2txt.py на следующее:

#!/usr/bin/env python 
import sys 
from pdfminer.pdfdocument import PDFDocument 
from pdfminer.pdfparser import PDFParser 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.pdfpage import PDFPage 
from pdfminer.converter import TextConverter 
from pdfminer.cmapdb import CMapDB 
from pdfminer.layout import LAParams 

def main(fp): 
    debug = 0 
    pagenos = set() 
    maxpages = 0 
    imagewriter = None 
    codec = 'utf-8' 
    caching = True 
    laparams = LAParams() 

    PDFDocument.debug = debug 
    PDFParser.debug = debug 
    CMapDB.debug = debug 
    PDFPageInterpreter.debug = debug 

    resourceManager = PDFResourceManager(caching=caching) 
    outfp = sys.stdout 
    device = TextConverter(resourceManager, outfp, codec=codec, laparams=laparams, imagewriter=imagewriter) 
    interpreter = PDFPageInterpreter(resourceManager, device) 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, caching=caching, check_extractable=True): 
     interpreter.process_page(page) 
    fp.close() 
    device.close() 
    outfp.close() 
    return # Here I want to return the extracted text string 

теперь я могу назвать его как модуль следующим образом:

>>> from my_pdf2txt import main 
>>> main(open('myfile.pdf', 'rb')) 
all the text contents 
of the pdf 
are printed out here.. 

В настоящее время она выводит результирующие строки с помощью sys.stdout.write(), но Я действительно хочу, чтобы он возвращал эти строки, используя оператор return в последней строке моего кода. Но так как использование этого sys.stdout.write скрыто глубоко на lines 165-167 in converter.py, я действительно не знаю, как заставить этот метод возвращать эти строки вместо того, чтобы записывать его в stdout.

Кто-нибудь знает, как я могу получить этот метод, чтобы вернуть найденные строки вместо того, чтобы записывать их в stdout? Все советы приветствуются!

+1

Вы можете использовать 'файл' или' StringIO' как 'stdout'. Таким образом, вы можете поймать результат и вернуть его. –

ответ

1

Как предложил Дарт Котик, вы можете указать sys.stdout на любой объект, подобный файлу. Затем, когда вы вызываете функцию, печатные данные будут направлены на ваш объект, а не на экран. Пример:

import sys 
import StringIO 

def frob(): 
    sys.stdout.write("Hello, how are you doing?") 


#we want to call frob, storing its output in a temporary buffer. 

#hold on to the old reference to stdout so we can restore it later. 
old_stdout = sys.stdout 

#create a temporary buffer object, and assign it to stdout 
output_buffer = StringIO.StringIO() 
sys.stdout = output_buffer 

frob() 

#retrieve the result. 
result = output_buffer.getvalue() 

#restore the old value of stdout. 
sys.stdout = old_stdout 

print "This is the result of frob: ", result 

Выход:

This is the result of frob: Hello, how are you doing? 

Для вашей проблемы, вы бы просто заменить frob() вызов с main(fp).

+1

Вы можете использовать 'sys.stdout = sys .__ stdout__' вместо' sys.stdout = old_stdout'. Мне кажется красивее –

Смежные вопросы