详解用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爬虫之抓取百度贴吧代码分享
Nov 06 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
python读取excel表格生成erlang数据
Aug 26 Python
13个最常用的Python深度学习库介绍
Oct 28 Python
scrapy爬虫完整实例
Jan 25 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
类似框架的js代码
2006/11/09 Javascript
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
vue-cli的eslint相关用法
2017/09/29 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
python实现画循环圆
2019/11/23 Python
opencv+python实现均值滤波
2020/02/19 Python
详细分析Python collections工具库
2020/07/16 Python
活动志愿者自荐信
2014/01/27 职场文书
周年庆典主持词
2014/04/02 职场文书
调解协议书
2014/04/16 职场文书
产品设计开发计划书
2014/05/07 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
护理见习报告范文
2014/11/03 职场文书
社区义诊通知
2015/04/24 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android