1

Pythonを使用してpdfからテキストを抽出しようとしています。このために、次のようにpdf2txt.py コマンドラインツールを使用して、かなり良い仕事をするpdfminerを見つけました。

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 の使用はconverter.pyの 165 ~ 167 行目の奥深くに隠されているため、標準出力に書き込む代わりに、このメソッドがこれらの文字列を返すようにする方法がよくわかりません。

見つかった文字列を stdout に書き込む代わりに、このメソッドを取得して返す方法を知っている人はいますか? すべてのヒントは大歓迎です!

4

2 に答える 2

1

Darth Kotik が提案したように、必要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)です。

于 2014-10-22T12:57:07.513 に答える