使用PDFMiner.six剖析PDF数据

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

PDF(可移植文档格式)文件是由Adobe创建的一种机动的文件格式,它答应文档在不同的软件、硬件和操作系统中一致地显示。每个PDF文件都包罗对固定布局文档的全面形貌,包括文本、字体、图形和其他必要的显示元素。pdf通常用于文档共享,因为它们能够保持原始格式。然而,以编程方式剖析和解释PDF内容可能是一项挑衅。这些困难包括pdf的复杂结构、不同的文本编码、复杂的布局、压缩的内容和嵌入的字体等题目。
  我们最近评估了几个流行的Python PDF库,如PyPDF/PyPDF2, PDFMiner.six, PyMuPDF, PDFplumber2,等。有些库得当提取文本,有些得当提取图像,有些速率很快,等等。在本文中,我们将重点先容如何开始使用PDFMiner.six。最新信息请随时关注官方网站。
  

环境准备

安装依赖包:
  1. pip install pdfminer.six
  2. pip install 'pdfminer.six[image]'
复制代码
示例PDF文件可以在这里找到,当然你也可以自己准备。让我们看看如何使用这些api:


  • 从PDF中提取文本
  • 从PDF中提取图像
  • 迭代PDF中的全部对象
  • 从PDF中提取TableOfContent (ToC)
抽取文本

通过高级API可用于从PDF中提取文本。
  1. from pdfminer.high_level import extract_text
  2. from os import path
  3. path = path.abspath(path.dirname(__file__))
  4. print(path)
  5. pdf_file = path + '/sample01.pdf'
  6. text = extract_text(pdf_file)
  7. print(text)
复制代码
抽取每一页

  1. from io import StringIO
  2. from pdfminer.converter import TextConverter
  3. from pdfminer.layout import LAParams
  4. from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
  5. from pdfminer.pdfpage import PDFPage
  6. from pdfminer.utils import open_filename
  7. from os import path
  8. path = path.abspath(path.dirname(__file__))
  9. print(path)
  10. def iter_text_per_page(pdf_file, password='', page_numbers=None, maxpages=0,
  11.                  caching=True, codec='utf-8', laparams=None):
  12.     if laparams is None:
  13.         laparams = LAParams()
  14.     with open_filename(pdf_file, "rb") as fp:
  15.         rsrcmgr = PDFResourceManager(caching=caching)
  16.         idx = 1
  17.         for page in PDFPage.get_pages(
  18.                 fp,
  19.                 page_numbers,
  20.                 maxpages=maxpages,
  21.                 password=password,
  22.                 caching=caching,
  23.         ):
  24.             with StringIO() as output_string:
  25.                 device = TextConverter(rsrcmgr, output_string, codec=codec,
  26.                                        laparams=laparams)
  27.                 interpreter = PDFPageInterpreter(rsrcmgr, device)
  28.                 interpreter.process_page(page)
  29.                 yield idx, output_string.getvalue()
  30.                 idx += 1
  31. def main():
  32.     pdf_file = path + '/sample02.pdf'
  33.     for count, page_text in iter_text_per_page(pdf_file):
  34.         print(f'page# {count}:\n{page_text}')
  35.         print()
  36. if __name__ == "__main__":
  37.     main()
复制代码
输出内容截取如下:
  1. page# 1:
  2. 产品主要功能包括数据采集、数据治理以及数据产品应用。企业典型应用场景利用 AI 算法实现业务分类、聚类、回归预测以及时间序列预测等。在销售领域基于历史数据实现销售预测,基于用户特征数据对客户分类实现精准营销;在采购领域利用历史数据预测采购价格,基于多维度指标实现供应商综合评价模型等。
  3. page# 2:
  4. 各类政策法规进行整理和归纳,帮助用户更加方便快捷地获取所需的政策信息。。。。
复制代码
抽取图像

提取图像的最简朴方法是调用命令行工具pdf2txt.py。它是在安装PDFMiner时安装的,并且位于Python可执行文件的相同位置。使用的操作系统。可执行文件’查找Python二进制文件的位置。
下面是示例用法:
  1. usage: pdf2txt.py [-h] [--version] [--debug] [--disable-caching] [--page-numbers PAGE_NUMBERS [PAGE_NUMBERS ...]]
  2.                   [--pagenos PAGENOS] [--maxpages MAXPAGES] [--password PASSWORD] [--rotation ROTATION] [--no-laparams]
  3.                   [--detect-vertical] [--line-overlap LINE_OVERLAP] [--char-margin CHAR_MARGIN] [--word-margin WORD_MARGIN]
  4.                   [--line-margin LINE_MARGIN] [--boxes-flow BOXES_FLOW] [--all-texts] [--outfile OUTFILE]
  5.                   [--output_type OUTPUT_TYPE] [--codec CODEC] [--output-dir OUTPUT_DIR] [--layoutmode LAYOUTMODE]
  6.                   [--scale SCALE] [--strip-control]
  7.                   files [files ...]
  8. To extract all text from pdf:
  9. pdf2txt.py --all-texts ../samples/manual.pdf
  10. To extract all images from pdf:
  11. pdf2txt.py --output-dir images ../sample03.pdf
复制代码
如果希望将其集成到应用程序中,只需从pdf2txt.py复制源代码即可.
获取页数

  1. from pdfminer.pdfdocument import PDFDocument
  2. from pdfminer.pdfparser import PDFParser
  3. from pdfminer.pdftypes import resolve1
  4. pdf_file = '../samples/brocher1.pdf'
  5. with open(pdf_file, 'rb') as f:
  6.     parser = PDFParser(f)
  7.     doc = PDFDocument(parser)
  8.     parser.set_document(doc)
  9.     pages = resolve1(doc.catalog['Pages'])
  10.     pages_count = pages.get('Count', 0)
  11.     print(pages_count)
复制代码
抽取表格数据

pdfminer抽取表格的输出看起来比PyPDF2好得多,我们可以很容易地使用regex或split()提取所需的数据。但是在现实天下中,PDF文档包罗很多噪声,id可以是不同的格式等等。我无法想象一个算法会考虑全部的事情。为了简化和加速我们的工作,我建议将PDF文件转换为HTML格式:
  1. from io import StringIO
  2. from pdfminer.high_level import extract_text_to_fp
  3. from pdfminer.layout import LAParams
  4. output = StringIO()
  5. with open('example.pdf', 'rb') as pdf_file:
  6.     extract_text_to_fp(pdf_file, output, laparams=LAParams(), output_type='html', codec=None)
  7. with open('example.html', 'a') as html_file:
  8.     html_file.write(output.getvalue())
复制代码
然后再利用html标签处理库抽取文本,这种方法正确率应该能得到保障。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表