详解用Python把PDF转为Word方法总结


Posted in Python onApril 27, 2021

先讲一下为啥要写这个文章,网上其实很多这种PDF转化的代码和软件。我一直想用Python做,但是网上搜到的代码很多都不能用,很多是2.7版本的代码,再就是PDF需要用到的库在导入的时候,很多的报错,解决起来特别费劲,而且自从2021年初以来,似乎网上很少有关PDF转化的代码出现了。我在研究了很多代码和pdfminer的用法后,总结了几个方法,目前这几种方法可以解决大多数格式的转化,后面我也专门放了提取PDF表格的代码,文末有高效的免费在线工具推荐。

下面这个是我最最推荐的方法 ,简单高效 ,只要是标准PDF文档,里面的图片和表格都可以保留格式

详解用Python把PDF转为Word方法总结

# pip install pdf2docx #安装依赖库
from pdf2docx import Converter

pdf_file = r'C:\Users\Administrator\Desktop\新建文件夹\mednine.pdf'
docx_file = r'C:\Users\Administrator\Desktop\Python教程\02.docx'

# convert pdf to docx
cv = Converter(pdf_file)
cv.convert(docx_file, start=0, end=None)
cv.close()

下面是另外三种常用方法

1 把标准格式的PDF转为Word,测试环境Python3.6.5和3.6.6(注意PDF内容仅仅是文字为主的里面没有图片图表的适用,不适合扫描版PDF,因为那只能用图片识别的方式进行)

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
import sys
import string
from docx import Document


def convert_pdf_2_text(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    
    device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    
    with open(path, 'rb') as fp:
        for page in PDFPage.get_pages(fp, set()):
            interpreter.process_page(page)
            #print(retstr.getvalue())  
        text = retstr.getvalue()
    device.close()
    retstr.close()
    return text


def pdf2txt():
    text=convert_pdf_2_text(path)
    with open('real.txt','a',encoding='utf-8') as f:
        for line in text.split('\n'):
            f.write(line+'\n')

        

def remove_control_characters(content):
    mpa = dict.fromkeys(range(32))
    return content.translate(mpa)
    
def save_text_to_word(content, file_path):     

    doc = Document()
    for line in content.split(''):
        print(line)
            
        paragraph = doc.add_paragraph()
        paragraph.add_run(remove_control_characters(line))
    doc.save(file_path)


if __name__ == '__main__':
    path = r'C:\Users\mayn\Desktop\程序临时\培训教材.pdf'  # 你自己的pdf文件路径及文件名 不适合扫描版 只适合标准PDF文件
    text = convert_pdf_2_text(path)
    save_text_to_word(text, 'output.doc')  #PDF转为word方法
    #pdf2txt()  #PDF转为txt方法

2专门提取PDF里面的表格,使用pdfplumber适合标准格式的PDF

import pdfplumber
import pandas as pd
import time
from time import  ctime
import psutil as ps 
#import threading
import gc
pdf = pdfplumber.open(r"C:\Users\Administrator\Desktop\新建文件夹\mednine.pdf")
N=len(pdf.pages)
print('总共有',N,'页')

def pdf2exl(i): # 读取了第i页,第i页是有表格的,
    print('********************************************************************************************************************************************************')
    print('正在输出第',str(i+1),'页表格')
    print('********************************************************************************************************************************************************')   
    p0 = pdf.pages[i]
    try:
        table = p0.extract_table()
        print(table)
    
        df = pd.DataFrame(table[1:], columns=table[0])
    #print(df)
        df.to_excel(r"C:\Users\Administrator\Desktop\新建文件夹\Model"+str(i+1)+".xlsx")
    
        #df.info(memory_usage='deep')
        
        
    except Exception as e:
        print('第'+str(i+1)+'页无表格,或者检查是否存在表格')       
       
        pass
    #print('目前内存占用率是百分之',str(ps.virtual_memory().percent),'    第',str(i+1),'页输出完毕')
    print('**********************************************************************************************************************************************************')
    print('\n\n\n') 
    time.sleep(5)


def dojob1():  #此函数  直接循环提取PDF里面各个页面的表格 
    print('*********************')
    for i in range(0,N):
        pdf2exl(i)

3也可以提取PDF里面的表格,使用camelot(camelot的安装可能需要点耐心,反正用的人不多)

import camelot
import wand

# 从PDF文件中提取表格

def output(i):  
    #print(tables)
    #for i in range(5):
    tables = camelot.read_pdf(r'C:\Users\Administrator\Desktop\新建文件夹\mednine.pdf', pages=str(i), flavor='stream')
    print(tables[i])
    
# 表格数据
    print(tables[i].data)
    
    tables[i].to_csv(r'C:\Users\Administrator\Desktop\新建文件夹\002'+str(i)+r'.csv')


def plotpdf():
        # 这个是画pdf 结构的函数 现在不能用 不要打开
    
    #print(tables[0])
    tables = camelot.read_pdf(r'C:\Users\mayn\Desktop\vcode工作区\11\路基.pdf', pages='200', flavor='stream')
    camelot.plot(tables[0], kind='text')
    print(tables[0])
    plt.show()
    # 绘制PDF文档的坐标,定位表格所在的位置  
    #plt = camelot.plot(tables[0],kind='text')
    #plt.show()
    #table_df = tables[0].df

#plotpdf() 
#i=3
#output(i)
for i in range(0,2):
    try:    
        output(i)
    except Exception as e:
        print('第'+str(i)+'页没找到表格啊啊啊')
        pass 
    continue

以下是pdfplumber测试效果

源文件如下

详解用Python把PDF转为Word方法总结

提取结果

详解用Python把PDF转为Word方法总结

最后补充2个免费转换的网站感觉还比较好用,关键是免费

http://pdfdo.com/pdf-to-word.aspx

http://app.xunjiepdf.com/pdf2word/

到此这篇关于详解用Python把PDF转为Word方法总结的文章就介绍到这了,更多相关Python把PDF转为Word内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python struct模块解析
Jun 12 Python
Python实现的多线程端口扫描工具分享
Jan 21 Python
24式加速你的Python(小结)
Jun 13 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
为什么相对PHP黑python的更少
Jun 21 Python
Python3如何在服务器打印资产信息
Aug 27 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
Python实现数据的序列化操作详解
Jul 07 Python
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
python实现监听键盘
Apr 26 #Python
python如何做代码性能分析
Apr 26 #Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 #Python
python如何进行基准测试
Apr 26 #Python
python实现简单的名片管理系统
You might like
让你的网站首页自动选择语言转跳
2006/12/06 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
使用python模拟命令行终端的示例
2019/08/13 Python
python manage.py runserver流程解析
2019/11/08 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
SQL Server笔试题
2012/01/10 面试题
你们项目是如何进行变更控制的
2015/08/26 面试题
医务人员自我评价
2014/01/26 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
排球赛新闻稿
2015/07/17 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
Python中常见的导入方式总结
2021/05/06 Python
python 提取html文本的方法
2021/05/20 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript