如何在Python 3中使用PDFminer.six?

10 浏览
0 Comments

如何在Python 3中使用PDFminer.six?

我想使用pdfminer.six这个工具,它可以与Python3一起用于从PDF文档中提取信息。问题是几乎没有好的文档,也没有关于如何使用该工具的源代码示例。\n我已经尝试了一些来自StackOverflow的代码,但没有成功。以下是我的代码。\n

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io 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)
    text = retstr.getvalue()
    fp.close()
    device.close()
    retstr.close()
    return text

\n我想要一些使用这个工具从PDF中获取数据的代码示例。

0
0 Comments

pdfminer.six是一个用于Python 3的pdfminer的社区维护版本。它有多个API可以从PDF中提取文本,具体取决于您的需求。在幕后,所有这些API都使用相同的逻辑来解析和分析布局。

如果您只想提取文本一次,可以使用命令行工具pdf2txt.py。命令如下:

$ pdf2txt.py example.pdf

如果您想使用Python提取文本(属性),可以使用高级API。这种方法是从PDF中以编程方式提取信息的首选解决方案。代码如下:

from pdfminer.high_level import extract_text
# 从pdf中提取文本。
text = extract_text('example.pdf')
# 提取LTPage对象的迭代器。
pages = extract_pages('example.pdf')

还有一种可组合的API,它在处理结果对象时提供了很大的灵活性。例如,它允许您创建自己的布局算法。这种方法在其他答案中被建议,但我只建议在需要自定义某些组件时使用。代码如下:

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())

问题:当我尝试将extract_text()方法的结果打印到控制台时,我得到了每个页面都是"None"的响应。为什么会发生这种情况?我尝试了两个不同来源的学术研究PDF文件。

答案:好吧,我找到了问题所在:我在Firefox中使用了打印功能来另存为PDF,而不是直接下载。这样做会使整个页面成为图像,而不是一组字形。

0
0 Comments

如何在Python 3中使用PDFminer.six?

PDFminer.six是一个用于处理PDF文件的Python库。它提供了从PDF中提取文本和布局信息的功能。本文将介绍安装PDFminer.six的方法以及如何使用它来提取PDF文件中的文本。

首先,需要安装pdfminer.six或pdfminer3。可以通过运行以下命令来安装pdfminer3:

pip install pdfminer3

在升级到Python 3.7之后,我切换到了pdfminer3。我在Ubuntu和macOS上使用Python 3.7.3。pdfminer3附带了两个有用的工具:pdf2txt.py和dumppdf.py。这些工具可以用来检查PDF文件的源代码,非常简单易懂。

下面是一个示例代码,用于从PDF文件中提取文本(需要添加PDF文件的路径):

from pdfminer3.layout import LAParams, LTTextBox
from pdfminer3.pdfpage import PDFPage
from pdfminer3.pdfinterp import PDFResourceManager
from pdfminer3.pdfinterp import PDFPageInterpreter
from pdfminer3.converter import PDFPageAggregator
from pdfminer3.converter import TextConverter
import io
resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager, fake_file_handle, laparams=LAParams())
page_interpreter = PDFPageInterpreter(resource_manager, converter)
with open('/path/to/file.pdf', 'rb') as fh:
    for page in PDFPage.get_pages(fh, caching=True, check_extractable=True):
        page_interpreter.process_page(page)
    text = fake_file_handle.getvalue()
# close open handles
converter.close()
fake_file_handle.close()
print(text)

如果遇到以下问题,可以考虑以下解决方法:

1. 如何在每页之后添加页面分隔符?

2. 是否有办法将文本转换为十进制或整数的数组?

3. 如何以有意义的方式提取PDF文件中的数据,例如年度或所缴纳的所得税等信息?

对于第一个问题,可以使用pdfminer3的`laparams`参数来指定页面分隔符。详情请参考以下链接:

[stackoverflow.com/questions/58889337](https://stackoverflow.com/questions/58889337)

至于第二个问题,可以考虑使用tabula-py库来将文本转换为数组。tabula-py是一个用于提取表格数据的Python库,可以将PDF文件中的表格转换为DataFrame对象。

希望这些信息对你有所帮助!

0