详解用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中使用HTML模版的教程
Apr 29 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
Python即时网络爬虫项目启动说明详解
Feb 23 Python
python一键去抖音视频水印工具
Sep 14 Python
python3+requests接口自动化session操作方法
Oct 13 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
python selenium 弹出框处理的实现
Feb 26 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
Python Lambda函数使用总结详解
Dec 11 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
django中嵌套的try-except实例
May 21 Python
Python Matplotlib库实现画局部图
Nov 17 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 json_encode奇怪问题说明
2011/09/27 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
企业整改报告范文
2014/11/08 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
房产证明范本
2015/06/19 职场文书
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL