详解用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根据出生年份简单计算生肖的方法
Mar 27 Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
python中循环语句while用法实例
May 16 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
Python操作redis实例小结【String、Hash、List、Set等】
May 16 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
python rsa-oaep加密的示例代码
Sep 23 Python
python3 kubernetes api的使用示例
Jan 12 Python
基于python的matplotlib制作双Y轴图
Apr 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
初识Laravel
2014/10/30 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
python requests 使用快速入门
2017/08/31 Python
Android分包MultiDex策略详解
2017/10/30 Python
python实现图像识别功能
2018/01/29 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python实现括号匹配方法详解
2020/02/10 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
车辆维修工自我评价怎么写
2013/09/20 职场文书
信访维稳工作汇报
2014/10/27 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android