python解析pdf,读取文字,可识别两栏pdf等

python解析pdf,读取文字,可识别两栏pdf等

  • 一、解析我们的pdf文件,首先第一步是解析普通类别的pdf(只有一栏)
  • 代码中包含注释(不懂得可以留言)
  • 二、处理拥有两栏等类型的pdf
  • 为什么要单独分析两栏呢?
  • 代码中包含注释(不懂得可以留言)
  • 欢迎大家留言交流!!!!!!!!
  • 一、解析我们的pdf文件,首先第一步是解析普通类别的pdf(只有一栏)

    代码中包含注释(不懂得可以留言)

    使用的话,只需要修改自己的pdf路径即可

    # encoding: utf-8
    import sys
    import importlib
    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocument
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.converter import PDFPageAggregator
    from pdfminer.layout import LTTextBoxHorizontal, LAParams, LTImage, LTCurve, LTFigure
    from pdfminer.pdfpage import PDFTextExtractionNotAllowed
    from pdfminer.pdfpage import PDFPage
    
    path = "1.pdf"
    
    
    def parse():
        fp = open(path, 'rb')
        # 用文件对象来创建一个pdf文档分析器PDFParser
        praser = PDFParser(fp)
        # 创建一个PDF文档PDFDocument
        doc = PDFDocument(praser)
    
        # 检测文档是否提供txt转换,不提供就忽略
        if not doc.is_extractable:
            raise PDFTextExtractionNotAllowed
        else:
            # 创建PDf 资源管理器 来管理共享资源PDFResourceManager
            rsrcmgr = PDFResourceManager()
            # 创建一个PDF设备对象LAParams
            laparams = LAParams()
            # 创建聚合器,用于读取文档的对象PDFPageAggregator
            device = PDFPageAggregator(rsrcmgr, laparams=laparams)
            # 创建一个PDF解释器对象,对文档编码,解释成Python能够识别的格式:PDFPageInterpreter
            interpreter = PDFPageInterpreter(rsrcmgr, device)
    
            # 循环遍历列表,每次处理一个page的内容
            for page in PDFPage.create_pages(doc):  # doc.get_pages() 获取page列表
                # 利用解释器的process_page()方法解析读取单独页数
                interpreter.process_page(page)
                # 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象,一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal等等,想要获取文本就获得对象的text属性,
                # 使用聚合器get_result()方法获取页面内容
                layout = device.get_result()
                for x in layout:
                    if isinstance(x, LTTextBoxHorizontal):
                        # 需要写出编码格式
                        with open(r'1.txt', 'a', encoding='utf-8') as f:
                            results = x.get_text()
                            f.write(results + '\n')
    
    
    
    if __name__ == '__main__':
        parse()
    
    
    

    二、处理拥有两栏等类型的pdf

    为什么要单独分析两栏呢?

    1、因为之前的方法读取pdf。他是相当于左栏读一句之后右栏读一句,最后输出的文本顺序是错乱的。不利于我们分析。
    2、我们需要的是将整体的左侧部分读取完成之后在读取右边的部分。
    3、pdf样例是:

    这种格式。

    代码中包含注释(不懂得可以留言)

    from PIL import Image
    import os
    import pytesseract
    import cv2 as cv
    import fitz
    
    def pdf_image(pdfPath,imgPath,zoom_x,zoom_y,rotation_angle):
        # 打开PDF文件
        pdf = fitz.open(pdfPath)
        # 逐页读取PDF
        for pg in range(0, pdf.pageCount):
            page = pdf[pg]
            # 设置缩放和旋转系数
            trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
            pm = page.getPixmap(matrix=trans, alpha=False)
            # 开始写图像
            pm.writePNG(imgPath+str(pg)+".png")
            #pm.writePNG(imgPath)
        pdf.close()
    pdf_path = '1.pdf'
    img_path ='1.png'
    pdf_image(pdf_path, img_path, 5, 5, 0)
    # 依赖opencv
    img = cv.imread(img_path)
    print(img)
    # text = pytesseract.image_to_string(Image.fromarray(img), lang='chi_tra')
    text = pytesseract.image_to_string(Image.fromarray(img), lang='chi_sim')
    # 不依赖opencv写法
    # text=pytesseract.image_to_string(Image.open(img_path))
    print(text)
    

    他的步骤是,首先将我们的pdf转换成图片的格式,之后通过使用pytesseract,来进行图片文字的识别操作。最后将我们的数据输出。
    可以很好的解决拥有两栏文字的pdf情况。

    欢迎大家留言交流!!!!!!!!

    来源:喜欢地上爬的孩子

    物联沃分享整理
    物联沃-IOTWORD物联网 » python解析pdf,读取文字,可识别两栏pdf等

    发表评论