首页 > 编程语言 >Python处理PDF——pdfplumber的安装与使用

Python处理PDF——pdfplumber的安装与使用

时间:2023-10-13 16:01:59浏览次数:36  
标签:pdfplumber Python text list url params str pdf PDF

Python处理PDF——pdfplumber的安装与使用

# -*- coding:utf-8 -*-

"""
@Time :2023/XX/XX
@Auth :Stone
@File :parse_online_pdf.py
@DESC :在线解析PDF文档
"""
import requests
import pdfplumber
import re, time, os


def online_pdf_parse(path_or_url, mode=1, url_params=None, proxies=None, save_as=None):
    '''
    <语法>
        参数path_or_url: PDF文档路径或者URL
        参数mode: 设置解析模式,
            [1, '1', 'text']返回文档内容 -> str
            [2, '2', 'table']返回表格信息 -> list
            [3, '3', 'text_and_table']返回文档内容及表格信息 -> tuple
        参数url_params: 读取在线PDF文档时,传入requests请求参数,类型 <- dict
        参数proxies: 读取在线PDF文档时,传入requests的代理
        参数save_as: 读取在线PDF文档时,若进行此项设置则另存为本地文档,方便后续使用
    </语法>
    '''

    url_mode = False

    # 判断是本地文档还是在线文档
    if re.search(r'''(?x)\A([a-z][a-z0-9+\-.]*)://([a-z0-9\-._~%]+|\[[a-z0-9\-._~%!$&'()*+,;=:]+\])''', path_or_url):
        url_mode = True
    else:
        pdf_path = path_or_url

    if url_mode:
        pdf_url = path_or_url
        headers_d = None
        headers_d = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)'}
        if not proxies:
            proxy_host = {}
        if not url_params:
            url_params = {}
            url_params['headers'] = headers_d
            url_params['data'] = None
            url_params['params'] = None
            url_params['proxies'] = proxies
        if not url_params['headers']: url_params['headers'] = headers_d
        if url_params['data'] or url_params['params']:
            response = requests.post(pdf_url, **url_params)
        else:
            response = requests.get(pdf_url, **url_params)

        # 写入临时文件再进行解析
        pdf_path = save_as if save_as else f'~temp{time.time()}~.pdf'
        with open(pdf_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()

    pdf_path = os.path.abspath(pdf_path)

    # 用pdfplumber对pdf文档进行解析
    pdf_text = ''
    pdf_tables = []
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            if str(mode).lower() in ['1', 'text', '0', '3']:
                pdf_text += str(page.extract_text())
            if str(mode).lower() in ['2', 'table', '0', '3']:
                pdf_tables += page.extract_tables()
            # print(f"pdf_tables={pdf_tables}")
            # print(f"*" * 166)

    # 删除临时pdf文档
    if url_mode and not save_as:
        try:
            os.remove(pdf_path)
        except Exception as e:
            pass

    if str(mode).lower() in ['1', 'text']:
        return pdf_text
    elif str(mode).lower() in ['2', 'table']:
        return pdf_tables
    elif str(mode).lower() in ['3', 'text_and_table']:
        return pdf_text, pdf_tables


def replace_str(str_font):
    """替换文字中的符号"""
    str_font = str(str_font).replace('\n', '').replace(' ', '').replace(': ', ':')
    return str_font


def link_last_list(need_list):
    """链接上一个list"""
    result_total = []
    for current_list in need_list:
        if current_list[0] == '':
            # 如果当前列表第一个值为空字符串
            if result_total:
                # 如果有上一个非空列表 list1=上一个列表,list2=当前列表,
                new_list = []
                for i in range(len(result_total[-1])):
                    new_value = str(result_total[-1][i]) + str(current_list[i])
                    new_list.append(new_value)
                result_total[-1] = new_list
            else:
                result_total.append(current_list)
        else:
            result_total.append(current_list)
    print(f"获取到所有数组合并后为={result_total}")
    return result_total


if __name__ == '__main__':
    pdf_url = f"********************************"
    pdf_text = online_pdf_parse(pdf_url, mode='table')
    # # print(f"获取的内容是={pdf_text}")
    # 识别后是按照页面进行划分数组,所以会产生一行的数据划分成两行
    data = []
    for item in pdf_text:
        for dd in item:
            data.append([replace_str(str_item) for str_item in dd])
    # print(f"all_list={data}")
    result_list = link_last_list(data)
    print(f"拼接后的数组为={result_list}")

  

标签:pdfplumber,Python,text,list,url,params,str,pdf,PDF
From: https://www.cnblogs.com/yoyo1216/p/17762359.html

相关文章

  • Python 累乘函数
    Python累乘函数是一个可以计算一个序列中所有元素的乘积的函数。有多种方法可以实现Python累乘函数,例如:使用循环结构,如for或while,遍历序列中的每个元素,并用一个变量存储累乘的结果。¹²使用递归函数,即自己调用自己的函数,将序列中的第一个元素与剩余元素的累乘结果相乘,直到序......
  • Python处理PDF——PyMuPDF的安装与使用
    1、安装PyMuPDF可以从源码安装,也可以从wheels安装。对于Windows,Linux和MacOSX平台,在PyPI的下载部分有wheels。这包括Python64位版本3.6到3.9。Windows版本也有32位版本。从最近开始,LinuxARM架构也出现了一些问题——查找平台标签manylinux2014_aarch64。除了标准库,它没有......
  • Python中的h5py介绍
    Python中的h5py介绍HDF5(HierarchicalDataFormat5)是一种用于存储和组织大量科学数据的文件格式。h5py是Python中的一个库,提供了对HDF5文件的高级封装,使得在Python中处理HDF5文件变得更加简单和高效。本文将介绍h5py的基本概念和使用方法。什么是HDF5文件?HDF5文件是一种用于存储和......
  • MNE-Python中的Epoch
    (图片来自links视频截图,侵删)在MNE-Python中,Epoch是指将原始脑电数据按照一定的时间窗口和事件标记进行切割和分类的过程。即将原始数据切割成若干个时间段(通常称为Epochs或Trials),每个时间段对应一个特定的事件(例如视觉刺激、听觉刺激、按键反应等)。Epoch是脑电数据分析中常用的......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-20-处理鼠标拖拽-下篇
    1.简介上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,其次有人私信宏哥说是有那种类似拼图的验证码如何处理。于是写了这一篇文章,另外也是相对前边做一个简单的总结......
  • word转pdf文档
    word转pdf文档1.依赖其中的aspose-words依赖地址:https://releases.aspose.com/java/repo/com/aspose/<!--word文档转化为pdf文档--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId&g......
  • 铅华洗尽,粉黛不施,人工智能AI基于ProPainter技术去除图片以及视频水印(Python3.10)
    视频以及图片修复技术是一项具有挑战性的AI视觉任务,它涉及在视频或者图片序列中填补缺失或损坏的区域,同时保持空间和时间的连贯性。该技术在视频补全、对象移除、视频恢复等领域有广泛应用。近年来,两种突出的方案在视频修复中崭露头角:flow-basedpropagation和spatiotemporalTran......
  • python实现ppt内容输出为word形式
    一、只输出文本内容frompptximportPresentationfromdocximportDocumentwordfile=Document()#给定ppt文件所在的路径filepath=r"C:\Users\18703\Desktop\智家经分\智家经分v2.pptx"pptx=Presentation(filepath)#遍历ppt文件的所有幻灯片页forslideinppt......
  • python实现docx转pptx(word文档转幻灯片)
    以前都是手工将word内容复制粘贴到ppt中,实在受够了。文心一言真是大忽悠,给的转换方案是用docx2pptx库,然而根本没有这个库,倒是可以用我下面的代码生成这个库:-)网上很多方案是转成图片形式插入ppt,导致无法正常编辑ppt.于是研究出以下方案:1.先将word文档的页面设置改为自定义大小......
  • python_两两比较计算相似矩阵
    距离矩阵余弦距离矩阵余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异点集内或矩阵内两两元素之间的距离矩阵##简单使用两重循环defcompute_squared_EDM_method(X):#获得矩阵都行和列,因为是行向......