摘要:这篇文章介绍了如何使用python【3.6版本】把pdf文件转换为word文档并替换word文档中的文字内容,这里替换的规则是中英转换或者其它自定义规则

pdf转换为word

pdf文件由于很难编辑,因而想要通过编程修改内容有些困难【不是不可能,只是代价比较大,特别是要保留原pdf格式的话】,故而这里介绍一个替换pdf文件文字内容的间接解决方案,即:把pdf文件转换为word然后再编程替换word的文字内容,当然替换完成后想把word转为pdf就简单的多了

本文这里转换pdf文件介绍四种方法:

  • 使用第三方工具
  • 使用pdfminer3k 解析pdf然后再把内容写入到word中
  • 使用第三方SDK
  • 使用LibreOffice 开发者库

这里简单说明下几种方法的优劣:

使用第三方工具的话,有这样两种情况:
  • Online版本,大多可以免费使用,但是转换麻烦,不能编程操作,需要手动实现

  • 软件版本,大多可以批量转换,但是大多转换有限制,需付费才能无限制使用,且不能编程处理

    如果上面的情况符合你的实际需要,那再好不过!当然,不能符合的话,接着往下看

使用pdfminer3k解析pdf文件

使用Python抽取PDF文件内容,包括文本、图像、线条等对象

使用第三方SDK

这个是一个比较好的选择,然而,SDK大多收费!!!这些SDK一般提供完善的开发者API接口,你可以方便而又简单的调用,楼主这里介绍一个叫做easyConvertPDF,他们提供一个pdf2word.py 的API,使用十分简单,转换效果页令人满意,只是,License太贵了,买不起,当然你可以下载试用

使用LibreOffice 开发者库

这个是Micro Office 支持的 Office 开发者库,里面可以实现PDF转换为Word,只是楼主在使用时一致没测试成功,下面给出一段使用代码,你需要先安装LibreOffice 才行

import os
import subprocessfor top, dirs, files in os.walk('/my/pdf/folder'):for filename in files:if filename.endswith('.pdf'):abspath = os.path.join(top, filename)subprocess.call('lowriter --invisible --convert-to doc "{}"'.format(abspath), shell=True)

从上面的四种方法中选择一种适合你的方法!

替换word文字内容

  • 替换word使用的是win32com 的包,使用这个包你需要先安装pywin32

pip install pywin32

安装完成后可能会出现如下错误

ImportError: DLL load failed: win32api, sys, os

这时你可以通过如下方式解决

C:\Users\yourname\Anaconda3\Lib\site-packages\pypiwin32_system32这个目录下的pythoncom36.dll 和pywintypes36.dll 拷贝到C:\Users\fanyu\Anaconda3\Lib\site-packages\win32 这个目录下

正常后编写测试程序

import os
import win32com.client# 处理Word文档的类class RemoteWord:def __init__(self, filename=None):self.xlApp=win32com.client.DispatchEx('Word.Application')self.xlApp.Visible=0self.xlApp.DisplayAlerts=0    #后台运行,不显示,不警告if filename:self.filename=filenameif os.path.exists(self.filename):self.doc=self.xlApp.Documents.Open(filename)else:self.doc = self.xlApp.Documents.Add()    #创建新的文档self.doc.SaveAs(filename)else:self.doc=self.xlApp.Documents.Add()self.filename=''def add_doc_end(self, string):'''在文档末尾添加内容'''rangee = self.doc.Range()rangee.InsertAfter('\n'+string)def add_doc_start(self, string):'''在文档开头添加内容'''rangee = self.doc.Range(0, 0)rangee.InsertBefore(string+'\n')def insert_doc(self, insertPos, string):'''在文档insertPos位置添加内容'''rangee = self.doc.Range(0, insertPos)if (insertPos == 0):rangee.InsertAfter(string)else:rangee.InsertAfter('\n'+string)def replace_doc(self,string,new_string):'''替换文字'''self.xlApp.Selection.Find.ClearFormatting()self.xlApp.Selection.Find.Replacement.ClearFormatting()self.xlApp.Selection.Find.Execute(string, False, False, False, False, False, True, 1, True, new_string, 2)def save(self):'''保存文档'''self.doc.Save()def save_as(self, filename):'''文档另存为'''self.doc.SaveAs(filename)def close(self):'''保存文件、关闭文件'''self.save()self.xlApp.Documents.Close()self.xlApp.Quit()if __name__ == '__main__':doc = RemoteWord(docx)  # 初始化一个doc对象# 这里演示替换内容,其他功能自己按照上面类的功能按需使用doc.replace_doc('your string','new string')  # 替换文本内容doc.close()

好了以上就完成了从pdf到word的完整内容,这里楼主附上一个实例:

楼主需要把pdf文件报表的英文内容替换为中文,也就是等价于翻译,只是翻译是提前做好的,放置在一个match_rule.xlsx的文件中 ,这个文件内容就是两列:原文 译文,然后程序会读取内容并自动替换。

下面楼主给出代码:

# 该程序实现把PDF转换为word然后读取word文件中的文字内容并按照特定的规则替换文字# -*- encoding: utf8 -*-__author__ = 'yooongchun'# 引入所需要的基本包import os
import re
import xlrd
import win32com.client
import logging
logging.basicConfig(level=logging.INFO)# 处理Word文档的类class RemoteWord:def __init__(self, filename=None):self.xlApp=win32com.client.DispatchEx('Word.Application')self.xlApp.Visible=0self.xlApp.DisplayAlerts=0    #后台运行,不显示,不警告if filename:self.filename=filenameif os.path.exists(self.filename):self.doc=self.xlApp.Documents.Open(filename)else:self.doc = self.xlApp.Documents.Add()    #创建新的文档self.doc.SaveAs(filename)else:self.doc=self.xlApp.Documents.Add()self.filename=''def add_doc_end(self, string):'''在文档末尾添加内容'''rangee = self.doc.Range()rangee.InsertAfter('\n'+string)def add_doc_start(self, string):'''在文档开头添加内容'''rangee = self.doc.Range(0, 0)rangee.InsertBefore(string+'\n')def insert_doc(self, insertPos, string):'''在文档insertPos位置添加内容'''rangee = self.doc.Range(0, insertPos)if (insertPos == 0):rangee.InsertAfter(string)else:rangee.InsertAfter('\n'+string)def replace_doc(self,string,new_string):'''替换文字'''self.xlApp.Selection.Find.ClearFormatting()self.xlApp.Selection.Find.Replacement.ClearFormatting()self.xlApp.Selection.Find.Execute(string, False, False, False, False, False, True, 1, True, new_string, 2)def save(self):'''保存文档'''self.doc.Save()def save_as(self, filename):'''文档另存为'''self.doc.SaveAs(filename)def close(self):'''保存文件、关闭文件'''self.save()self.xlApp.Documents.Close()self.xlApp.Quit()# 遍历找到word文件路径def find_docx(pdf_path):file_list=[]if os.path.isfile(pdf_path):file_list.append(pdf_path)else:for top, dirs, files in os.walk(pdf_path):for filename in files:if filename.endswith('.docx')or filename.endswith('.doc'):abspath = os.path.join(top, filename)file_list.append(abspath)return file_list# 替换文本内容def replace_docx(rule,docx_list):len_doc=len(docx_list)i=0  # 计数for docx in docx_list:i+=1logging.info('开始替换第 %s/%s 个word文件内容:%s...'%(i,len_doc,os.path.basename(docx)))doc = RemoteWord(docx)  # 初始化一个doc对象for item in rule:  # 替换doc.replace_doc(item[0], item[1])doc.close()logging.info('完成!')# 对内容进行排序# 这里因为在进行文本替换的时候涉及到一个长句里面的部分可能被短句(相同内容)内容替换掉# 因而必须先把文本按照从长到短的顺序来进行替换def sort_rule(rule):result=[]for item, val in rule.items():le=len(item)flag = Trueif len(result)>0:for index, res in enumerate(result):if len(item) >= len(res[0]):flag=Falseresult.insert(index, (item, val))breakif flag:result.append((item, val))else:result.append((item,val))return result# 加载Excel,把取得的内容返回,格式:dict{'原文':'译文'}def init_excel(excel_path):logging.info('加载文本匹配规则的Excel:%s' % os.path.basename(excel_path))rule={}  # 储存原文和翻译内容pdf_path=''try:book = xlrd.open_workbook(excel_path)  # 打开一个wordbooksheet = book.sheet_by_name('Translation')  # 切换sheetrows = sheet.nrows  # 行数for row in range(rows - 1):text_ori=sheet.cell(row, 0).value  # 取得数据:原文text_trans=sheet.cell(row,1).value  # 取得数据:译文if not re.match(r'^#.+',text_ori):  # 原文不以#开头if text_ori == 'pdf文件(或文件夹)地址':   # 获得pdf文件路径pdf_path=text_transelse:rule[text_ori]=text_trans  # 取得值加入textexcept IOError:raise IOErrorlogging.info('加载Excel完成!')return pdf_path, ruleif __name__ == '__main__':excel_path = './match_rule.xlsx'    # 替换规则的Excel文件地址logging.info('正在打开pdf转换软件,请手动转换你的pdf文件!')os.popen(r'"./PDF2Word/pdf2word.exe"')flag=input('你已经完成pdf文件转换了吗?(y/n):')while not flag == 'y':logging.info('请先转换pdf!')flag = input('你已经完成pdf文件转换了吗?(y/n):')pdf_path, rule = init_excel(excel_path)  # 加载Excel,取得内容sorted_rule=sort_rule(rule)  # 排序规则:按照由长到短docx_list=find_docx(pdf_path)  # 获取docx文件路径replace_docx(sorted_rule,docx_list)  # 替换内容logging.info('程序执行完成!')

python替换word中的文字内容相关推荐

  1. python替换word中的关键文字(使用通配符)

    环境:Python3.6 本文主要是通过win32com操作word,对word中进行常用的操作.本文以替换为例,讲解一下如何使用Python在word中使用"通配符模式"(类似于 ...

  2. Word控件Spire.Doc 【文本】教程(14) ;如何用图片替换Word中的文字

    在 Spire.Doc 的教程部分,我们介绍了"用 C# 中的表格替换 Word 中的文本"和"用 C# 中的文本替换 Word 中的图像"的简单方法.有时,我 ...

  3. POI方式替换Word中的文字

    开发当中,很多时候我们会需要将我们的数据写入到Word当中,或者说导出.这时候我们会使用一些特定的标识来达到我们替换内容的目的.在Word中定义好我们需要替换的内容,也就是模板.然后再写入数据.源码如 ...

  4. VBS 从Excel中获取数据,批量替换word中的文字

    简介 比如我有一个需求,需要把一份 word 中的英文国家名全部替换成中文国家名,excel中的第一列是英文国家名,第二列是中文国家名.人工完成的话,费时费力,使用我编写的程序,双击一下,瞬间完成. ...

  5. 用python的win32com模块替换word中的文字搞定批量打印奖状

    六一将至,学校要表彰优秀同学,于是安排我去打印奖状.按照一般的情况,打印奖状都是打印个模板批量复印,然后手工填写名字,然后我们的校长特别叮嘱我说,名字也要用打印的,这样比较正式.看到获奖名单上的100 ...

  6. 批量自动替换word中的文字

    from docx import Document import xlrd #定义一个方法用来替换 def change_test(old_test,new_test): #替换所有的段落 all_p ...

  7. python替换word中的图片_python如何提取word内的图片

    解压.docx文件实现提取图片 前言 .docx文件其实也就是一个压缩文件,当我们将一个.docx文件直接解压后可以看到如下目录 其中我们要找的图片就在word/media目录内,如图 所以,要提取w ...

  8. python复制word中的内容,包括格式、图片、文字

    需要安装模块,win32com 下载地址:http://download.csdn.net/detail/clean_water/9759816 # 导入模块 import win32com.clie ...

  9. python 替换word内容 doc转换成docx

    python 替换word内容 doc转换成docx doc转换成docx 北京市,天津市,上海市,重庆市,河北省,山西省,辽宁省,吉林省,黑龙江省,江苏省,浙江省,安徽省,福建省,江西省,山东省,河 ...

最新文章

  1. XPath基本概念(一)
  2. Ubuntu中的颜色选择器实用程序(彩色移液器)[关闭]
  3. SharePoint 2013 入门教程之创建页面布局及页面
  4. linux显卡烤机操作,显卡拷机必备:FurMark时隔一年全新升级
  5. C#——《C#语言程序设计》实验报告——继承与多态——电视和电灯委托
  6. Linux文本处理tr命令笔记
  7. [JavaWeb-HTML]HTML标签_语义化标签
  8. 速卖通手机端怎样加入html,如何正确使用速卖通手机版的关联营销模板
  9. 绿盟漏洞扫描_主机安全漏洞解决方案
  10. ASP.NET 百万级分页查询(Oracle)
  11. 【P1714】切蛋糕(单调队列)
  12. 独家 | 林元庆新征程:创立AIbee估值8亿,毗邻百度,吴恩达助攻
  13. HDU_2082 找单词 (生成函数)
  14. idea 2017 常用图标
  15. mapxtreme for java_MapXtreme For Java 4.8.2 超菜入门
  16. SPSS学习笔记(六)线性相关及回归
  17. 如何不打开excel文件搜索其中内容---在线绿色工具
  18. 【转载】设备\Device\Harddisk0\D 有一个不正确的区块
  19. 安卓没有删除谷歌服务框架
  20. mysql root 访问被拒绝_mysql-“连接失败:用户'root'@'localhost'(使用密码:是)的访问被拒绝”...

热门文章

  1. 开发rpg制作游戏用的角色人物素材图片,《石器时代》,共20张图片
  2. TMS320F28x上RTOS移植关键技术分析
  3. 安信可lora模块测试 程序
  4. tar的c++版本入门教程
  5. sakai的相关概念
  6. 第一部分(二):兰州烧饼
  7. palacehoder的自定义样式【输入框input /文本域textarea】
  8. 宝马宣布国产3系5系即将发布
  9. 将VS Code打造成炫酷全能IDE
  10. python运行对电脑的要求_这样运行Python命令会给电脑带来极大的隐患