如何在Python 3中使用PDFminer.six?
如何在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中获取数据的代码示例。
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,而不是直接下载。这样做会使整个页面成为图像,而不是一组字形。
如何在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对象。
希望这些信息对你有所帮助!