详解用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中使用hashlib模块处理算法的教程
Apr 28 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
MATLAB数学建模之画图汇总
Jul 16 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
一篇文章带你搞懂Python类的相关知识
May 20 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
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
PHP自定义多进制的方法
2016/11/03 PHP
PHP实现微信退款功能
2018/10/02 PHP
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python判断自身是否正在运行的方法
2019/08/08 Python
python爬虫添加请求头代码实例
2019/12/28 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
水产养殖学应届生求职信
2013/09/29 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
银行简历自我评价
2014/02/11 职场文书
文明风采获奖感言
2014/02/18 职场文书
数学教研活动总结
2014/07/02 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
三八妇女节主持词
2015/07/04 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
公司转让协议书
2016/03/19 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
浅析python中特殊文件和特殊函数
2022/02/24 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技