当前位置: 首页 > 工具软件 > PDFMiner > 使用案例 >

Python3.9 PDFMiner3k提取PDF为txt文档

左博学
2023-12-01

记录下在使用PDFMiner3k时遇到的问题
这里是博主
点击链接查看

 
import urllib
import importlib,sys
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfdevice import PDFDevice
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
 
 
def parse(DataIO, save_path):
 
    #用文件对象创建一个PDF文档分析器
    parser = PDFParser(DataIO)
    #创建一个PDF文档
    doc = PDFDocument()
    #分析器和文档相互连接
    parser.set_document(doc)
    doc.set_parser(parser)
    #提供初始化密码,没有默认为空
    doc.initialize()
    #检查文档是否可以转成TXT,如果不可以就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        #创建PDF资源管理器,来管理共享资源
        rsrcmagr = PDFResourceManager()
        #创建一个PDF设备对象
        laparams = LAParams()
        #将资源管理器和设备对象聚合
        device = PDFPageAggregator(rsrcmagr, laparams=laparams)
        #创建一个PDF解释器对象
        interpreter = PDFPageInterpreter(rsrcmagr, device)
 
        #循环遍历列表,每次处理一个page内容
        #doc.get_pages()获取page列表
        for page in doc.get_pages():
            interpreter.process_page(page)
            #接收该页面的LTPage对象
            layout = device.get_result()
            #这里的layout是一个LTPage对象 里面存放着page解析出来的各种对象
            #一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等一些对像
            #想要获取文本就得获取对象的text属性
            for x in layout:
                try:
                    if(isinstance(x, LTTextBoxHorizontal)):
                        with open('%s' % (save_path), 'a') as f:
                            result = x.get_text()
                            print (result)
                            f.write(result + "\n")
                except:
                    print("Failed")
 
 
if __name__ == '__main__':
    #解析本地PDF文本,保存到本地TXT
    with open(r'E:\parse_pdf\3.pdf','rb') as pdf_html:
        parse(pdf_html, r'E:\parse_pdf\d.txt')
 
    #解析网络上的PDF,保存文本到本地
    # url = "https:"
    # pdf_html = urllib.urlopen(url).read()
    # DataIO = StringIO(pdf_html)
    # parse_pdf(DataIO, r'E:\parse_pdf')

但是报出了如下错误:

Traceback (most recent call last):
  File "D:\pythonProject\main.py", line 5, in <module>
    from pdfminer.pdfparser import PDFParser, PDFDocument
ImportError: cannot import name 'PDFDocument' from 'pdfminer.pdfparser' 

点击查阅该博客

from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

改为

from pdfminer.pdfpage import PDFTextExtractionNotAllowed

而后又报出

Traceback (most recent call last):
  File "D:\pythonProject\main.py", line 5, in <module>
    from pdfminer.pdfparser import PDFParser, PDFDocument
ImportError: cannot import name 'PDFDocument' from 'pdfminer.pdfparser'

参考该博客

from pdfminer.pdfparser import PDFParser, PDFDocument

改为

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

接着又报出

Traceback (most recent call last):
  File "D:\pythonProject\main.py", line 63, in <module>
    parse(pdf_html, r'E:\知识图谱项目\d.txt')
  File "D:\pythonProject\main.py", line 21, in parse
    doc = PDFDocument()
TypeError: __init__() missing 1 required positional argument: 'parser'

doc = PDFDocument()

改为

doc = PDFDocument(parser)

然后删除或注释掉

   parser.set_document(doc)
    doc.set_parser(parser)
    # 提供初始化密码,没有默认为空
    doc.initialize()

并且将

 for page in doc.get_pages():

改为

for page in PDFPage.create_pages(doc): 

最后编译运行,完美解决。

注意!!!!

with open(r'E:\parse_pdf\3.pdf','rb') as pdf_html:
        parse(pdf_html, r'E:\parse_pdf\d.txt')

这里需要对路径改成自己的!!!!

 类似资料: