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 行深处,我真的不知道如何让这个方法返回这些字符串而不是将其写入标准输出。

有谁知道我怎样才能让这个方法返回找到的字符串而不是将它们写入标准输出?欢迎所有提示!

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 回答
0

问题是如何将输出作为字符串返回。如果这里有人想知道如何将输出直接写入文件,而不是在终端上打印。这是一个对我有用的单线解决方案。

只需添加以下行:

sys.stdout=open("pdf_text.txt","w")

行前:

outfp = sys.stdout.

希望这对某人有所帮助。

于 2019-02-16T13:43:41.927 回答