Python 快速合并PDF表格转换输出CSV文件

这篇具有很好参考价值的文章主要介绍了Python 快速合并PDF表格转换输出CSV文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python 快速合并PDF表格转换输出CSV文件,Python,python单位的刷脸考勤机后台系统做得比较差,只能导出每个部门的出勤统计表pdf,格式如下:

Python 快速合并PDF表格转换输出CSV文件,Python,python

近期领导要看所有部门的考勤数据,于是动手快速写了个合并pdf并输出csv文件的脚本。

安装模块

pypdf2,pdfplumber,前者用于合并,后者用于读表格。

C:\>pip install pypdf2
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting pypdf2
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/8e/5e/c86a5643653825d3c913719e788e41386bee415c2b87b4f955432f2de6b2/pypdf2-3.0.1-py3-none-any.whl (232 kB)
Installing collected packages: pypdf2
Successfully installed pypdf2-3.0.1

C:\>pip install pdfplumber
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting pdfplumber
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/f8/d3/f58c2d5d86a585e438c6708f568eca79e7c4e6ee3d5210cf8b31d38cb021/pdfplumber-0.10.3-py3-none-any.whl (48 kB)
Requirement already satisfied: pdfminer.six==20221105 in d:\program files\python\lib\site-packages (from pdfplumber) (20221105)
Requirement already satisfied: Pillow>=9.1 in d:\program files\python\lib\site-packages (from pdfplumber) (10.2.0)
Requirement already satisfied: pypdfium2>=4.18.0 in d:\program files\python\lib\site-packages (from pdfplumber) (4.25.0)
Requirement already satisfied: charset-normalizer>=2.0.0 in d:\program files\python\lib\site-packages (from pdfminer.six==20221105->pdfplumber) (3.3.2)
Requirement already satisfied: cryptography>=36.0.0 in d:\program files\python\lib\site-packages (from pdfminer.six==20221105->pdfplumber) (41.0.7)
Requirement already satisfied: cffi>=1.12 in d:\program files\python\lib\site-packages (from cryptography>=36.0.0->pdfminer.six==20221105->pdfplumber) (1.16.0)
Requirement already satisfied: pycparser in d:\program files\python\lib\site-packages (from cffi>=1.12->cryptography>=36.0.0->pdfminer.six==20221105->pdfplumber) (2.21)
Installing collected packages: pdfplumber
Successfully installed pdfplumber-0.10.3

读取、合并文件

PyPDF2

PyPDF2 用于对PDF文件的分离、合并、裁剪、转换、加密、解密等操作。

读取和合并pdf文件正好以前写过,主要代码如下: 

    with codecs.open(file_path, 'rb', encoding='utf-16') as file:
        pdf_reader = PyPDF2.PdfReader(file)
        text = ''
        for page_num in range(len(pdf_reader.pages)):
            tt = pdf_reader.pages[page_num].extract_text()
            print(tt)
            text += tt
......

    pdfMerge = PyPDF2.PdfMerger()
    try:
        for pdf in pdfLists:
            pdfMerge.append(pdf, import_outline=False)
        pdfMerge.write(pdfFileN)
        pdfMerge.close
        print("PDF files merged successfully!")

......

表格读取

pdfplumber

pdfplumber 用于读取PDF文件文本和表格提取,功能比较均衡。

优点:

  • 每页单独对象,支持文本、表格数据的抽取(亮点)
  • 文本抽取:保留了文本的格式,比如换行位置有空格,可以通过这个特点将一段的文本整合
  • 表格数据抽取:不会被换行数据所干扰

缺点:

  • 进行文本抽取时,如果一页有文本和表格,那么抽取的文本数据也会包括表格数据
  • 对于有合并单元格的表格,无法还原表格结构
  • 表格数据不能100%保证和原数据一致,可能缺少几个字,可能识别出错等
  • 对于无边框的表格,处理效果很差
  • 流程图和时序图会对处理产生严重影响

读取代码如下:

pdf =  pdfplumber.open(pdfFileN)
for page in pdf.pages:
    tables = page.extract_tables(table_settings = {})
    for table in tables:
        print(table)

遍历得到的是一个个二维列表,可以根据需要自己清洗数据。

程序界面

easygui

就用这个库,弄2个对话框简单了事:

Python 快速合并PDF表格转换输出CSV文件,Python,python

选择一个文件夹,把其下的所有pdf文件合并,然后转换输出csv文件: 

Python 快速合并PDF表格转换输出CSV文件,Python,python

输出的文件格式如下:

Python 快速合并PDF表格转换输出CSV文件,Python,python

更多easygui内容请见: 

Python 简易图形界面库easygui 对话框大全-CSDN博客文章浏览阅读4.2k次,点赞117次,收藏96次。提供了“继续”和“取消”选项,并返回True(表示继续)或False(表示取消)。", title="结束", ok_button="干得好!easygui.ccbox(msg, title, choices=('退出[E]','取消[C]'))选择“Chocolate”后点OK就把所选择的项赋值给变量choice,点Cancel则返回None。如果选择了第一个按钮,则返回“True”。提供了Yes和No的选择,并返回“True”或“False”。在列表框中提供了可供选择的由元组或列表指定的选项列表。https://blog.csdn.net/boysoft2002/article/details/135179267Python 简易图形界面库easygui 对话框大全(续)-CSDN博客文章浏览阅读1.2k次,点赞67次,收藏58次。Python 简易图形界面库easygui 对话框大全-CSDN博客提供了“继续”和“取消”选项,并返回True(表示继续)或False(表示取消)。", title="结束", ok_button="干得好!easygui.ccbox(msg, title, choices=('退出[E]','取消[C]'))选择“Chocolate”后点OK就把所选择的项赋值给变量choice,点Cancel则返回None。如果选择了第一个按钮,则返回“True”。https://blog.csdn.net/boysoft2002/article/details/135297373以上几样库拼凑在一起,就可以完成合并和转换pdf表格,完整代码如下:

import sys,os
import datetime as dt
import PyPDF2,pdfplumber
import easygui as eg

def get_pdf_text(file_path):
    with codecs.open(file_path, 'rb', encoding='utf-16') as file:
        pdf_reader = PyPDF2.PdfReader(file)
        text = ''
        for page_num in range(len(pdf_reader.pages)):
            tt = pdf_reader.pages[page_num].extract_text()
            print(tt)
            text += tt
    return text

def strDateTime(diff=0):
    now = dt.datetime.now()
    future_time = now + dt.timedelta(days=diff)    
    return f'{future_time.year:04}{future_time.month:02}{future_time.day:02}_{future_time.hour:02}{future_time.minute:02}{future_time.second:02}'

txtStart = "PDFmerged_"
try:
    Dir = eg.diropenbox(msg=None, title=None, default='./')
    pdfLists = [f for f in os.listdir(Dir) if f.endswith('.pdf') and not f.startswith(txtStart)]
    pdfFileN = Dir + '\\' + txtStart + strDateTime() + ".pdf"
except:
    print('取消退出!')
    sys.exit(0)

if len(pdfLists)==0:
    eg.msgbox("此文件夹没有Pdf文件!", title="结束", ok_button="Fail")
    sys.exit(0)
else:
    pdfMerge = PyPDF2.PdfMerger()
    try:
        for pdf in pdfLists:
            pdfMerge.append(pdf, import_outline=False)
        pdfMerge.write(pdfFileN)
        pdfMerge.close
        print("PDF files merged successfully!")
    except:
        eg.msgbox("合并pdf失败!", title="结束", ok_button="Fail")
        sys.exit(0)

pdf =  pdfplumber.open(pdfFileN)
dct = dict()
for page in pdf.pages:
    tables = page.extract_tables(table_settings = {})
    for table in tables:
        for lst in table:
            tmp = lst[1:]
            tmp = [tmp[0]]+tmp[3:8]+[tmp[-1]]
            try:
                tmp[0] = tmp[0].replace('\n','')
                tmp[0] = tmp[0].split('/')
                tmp[0] = tmp[0][-1]
            except:
                pass
            if lst[0]=='时间':
                dct[lst[0]] = tmp[0]
            else:
                dct[','.join([lst[0],tmp[0] if tmp[0] else ''])] = ','.join(tmp[1:]) if all(tmp[1:]) else ''
pdf.close()
try:os.remove(pdfFileN)
except:pass
try:
    fn = "考勤表(" + dct['时间'] + ")"+strDateTime()+".csv"
except:
    fn = "考勤表"+strDateTime()+".csv"
try:
    with open(fn, 'w') as f:
        for k,v in dct.items():
            print(','.join([k,v]), file=f)
    eg.msgbox(f"考勤表保存成功!\n\n\n\t文件名:{fn}", title="结束", ok_button="Good!")
    print(f"CSV file written successfully! by HannYang {strDateTime()}")
except:
    eg.msgbox("保存csv文件失败!", title="结束", ok_button="Fail")

后话

如果要直接输出Excel表格,则需要另安装和导入xlwt模块。实现的代码大致如下:

    myxl = xlwt.Workbook()
    style = xlwt.easyxf('align: wrap yes; align: horiz center; font: bold yes;borders:top thin; borders:bottom thin; borders:left thin; borders:right thin;') 
    sheet = myxl.add_sheet('考勤表')
    wcol = [20,40,50,75,40,75]
    for i in range(6):
        sheet.col(i).width = wcol[i]*80
    sheet.write_merge(0,0,0,8,'出勤统计报表',style)
    style = xlwt.easyxf('borders:top thin; borders:bottom thin; borders:left thin; borders:right thin;') 
    sheet.write_merge(1,1,0,1,'单位(盖章):',style)
    sheet.write_merge(2,2,0,1,'*经办人:',style)
    sheet.write(1,3,'填表日期:',style)
    sheet.write_merge(1,1,4,8,strToday(),style)
    sheet.write(2,3,'*联系电话:',style)
    sheet.write(2,2,adminName,style)
    sheet.write_merge(2,2,4,8,adminMobil,style)
    for i,t in enumerate(head.strip().split(',')):
            sheet.write(3,i,t,style)
    with open('考勤表.csv', 'r') as f:
        for i,row in enumerate(csv.reader(f)):
            if i==0:continue
            for j,col in enumerate(row):
                    sheet.write(3+i,j,col,style)
    excelfile = 'Output_'+strDateTime()+'('+defaultValue+').xls'
    myxl.save(excelfile)

另外不赶时间的话,还可以用PySimpleGUI库写个带漂亮gui界面的程序,具体操作方法请参见:

探索PySimpleGUI:一款简洁易用的图形用户界面库-CSDN博客文章浏览阅读1.9k次,点赞105次,收藏88次。PySimpleGUI是一个基于Tkinter、WxPython、Qt等底层库构建的图形界面框架,其设计目标是使Python GUI编程变得更加简单直观,大大降低了入门门槛。无论是初学者还是经验丰富的开发者,都可以快速上手并高效地创建出功能丰富、外观现代的桌面应用程序。PySimpleGUI的核心优势在于其高度抽象化的API设计,它提供了包括按钮、输入框、列表框、滑块等各种常见的GUI元素。除了基本的布局和样式设置,PySimpleGUI还支持事件驱动的编程模型。https://blog.csdn.net/boysoft2002/article/details/135315323


目录

安装模块

读取、合并文件

PyPDF2

表格读取

pdfplumber

程序界面

easygui

后话文章来源地址https://www.toymoban.com/news/detail-777775.html


到了这里,关于Python 快速合并PDF表格转换输出CSV文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【工程实践】python 合并多个csv文件

            处理数据时,有多个csv文件需要合并。有两个方法可以实现,第一个是可以通过python提供的pandas模块,借助 pd.concat()实现多个csv文件的合并。第二个是通过linux命令实现。 1-1 获得全部csv文件路径 1-2  查看数据 1-3 合并数据 2-1 合并数据         将所有的csv文件

    2024年02月11日
    浏览(63)
  • SpringBoot Thymeleaf企业级真实应用:使用Flying Saucer结合iText5将HTML界面数据转换为PDF输出(四) 表格中断问题

    接上一篇 SpringBoot Thymeleaf企业级真实应用:使用Flying Saucer结合iText5将HTML界面数据转换为PDF输出(三) 给pdf加水印、页眉页脚、页眉logo 设置表格的css样式

    2024年02月12日
    浏览(41)
  • 【PDF合并】利用 Python 合并 PDF 文件

    依赖安装 在 Python 中,可以使用 PyPDF2 模块来合并多个 PDF 文件。 首先导入 PdfFileMerger 类。接下来,创建一个 PdfFileMerger 对象 merger。 然后,使用 append 方法逐个添加要合并的 PDF 文件。在示例中,将要合并的 PDF 文件路径存储在列表 pdf_files 中,可以根据实际情况进行修改。

    2024年03月16日
    浏览(71)
  • python 将txt文件转换成csv文件

    今天今天又来了一个冷门脚本!读取txt文件中的数据转换成csv文件。 比如下面文件开始有规律分布着需要提取的数据,从第三行开始提取,并且对数据进行处理,最后进行输出。 说明: 以下代码不仅仅是提取数据,还包含处理的步骤,处理的方式不进行公开, from utils.fea

    2024年02月12日
    浏览(49)
  • 快速分隔文件(split),合并文件(paste)的命令;eval(先扫描输出在执行)命令

    语法格式: split 【选项】 参数 原始文件 拆分后文件名前缀 常用选项 -l:以行数拆分 -b:以大小拆分 以行数拆分 以大小拆分 语法格式: paste 【选项】 参数 文件 常用选项 -d :指定分隔符默认为Tab -s :横向排列文件 paste命令 paste -d 修改间隔符 paste -s 横向排列 例:将两个

    2024年02月04日
    浏览(27)
  • 【Python】python把数据转换为csv文件

    目录 python把数据转换为csv文件 python把数据转换为txt文件 将数据转换为CSV格式文件可以使用Python内置的csv模块进行操作,以下是一段简单的示例代码:

    2024年02月16日
    浏览(45)
  • Python之xlsx文件与csv文件相互转换

    Python之xlsx文件与csv文件相互转换 在Python中,可以使用xlrd和csv模块来处理Excel文件和csv文件。 xlsx文件转csv文件 在2个文件之间转换,需要注意一个文件的字符转码问题。 使用第三方库pandas将xlsx文件转csv文件 csv文件转换成xlsx文件 使用pandas将csv文件转成xlsx文件

    2024年02月16日
    浏览(32)
  • Python提取JSON文件中的指定数据并保存在CSV或Excel表格文件内

      本文介绍基于 Python 语言,读取 JSON 格式的数据,提取其中的指定内容,并将提取到的数据保存到 .csv 格式或 .xlsx 格式的表格文件中的方法。    JSON 格式的数据在数据信息交换过程中经常使用,但是相对而言并不直观;因此,有时我们希望将 JSON 格式的数据转换为 E

    2024年02月11日
    浏览(30)
  • Python读取一个csv文件并转换为Numpy矩阵

    利用pandas库读取,转为numpy矩阵 注意读取csv文件时第一行数据默认不读,因此需要给csv加一行。   运行结果  

    2024年02月12日
    浏览(32)
  • Python操作PDF:PDF文件合并与PDF页面重排

    处理大量的 PDF 文档是非常麻烦的事情,频繁地打开关闭文件会严重影响工作效率。对于一大堆内容相关的 PDF 文件,我们在处理时可以将这些 PDF 文件合并起来,作为单一文件处理,从而提高处理效率。同时,我们也可以选取不同PDF文件中想要的页面制作新的 PDF 文件。本文

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包