用Python将word文件转换成html(转)
用Python将word文件转换成html
序
最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上。客户大大说,要智能推送!要掌握节奏!要深度学习!要让用户留恋网站无法自拔!
话说符合以上特点的我也只能联想到某榴了。
当然,万里长征的第一步是把文章导入我们的数据库。项目使用的是AWS的dynamoDB,是非关系型数据库,所有内容都是以json的形式储存的。而客户大大购买来的文章,一共600多篇,要么是word要么是Adobe indesign的indd。找了一圈,没有发现合适的应用可以把word或indd转化成干净的html。所以我只能自己造轮子啦~听说python很擅长文本处理,所以就是你了,python!这是我第一次用python写项目,不符合规范的地方欢迎大神提点。
太长不看
用逆天的python 模块mammoth和docx 处理你的word文件;把indd批量转化成pdf然后用layout_scanner转化成html。
word批量转化为html
1、 建立文件结构并批量读取文件
在根目录下创建几个文件夹,用来放不同格式的文件,我把所有要处理的word文件放在docfiles 这个子目录里。word.py里写转化程序。
├── docfiles├── imgs├── inddfiles├── output└── pdfs└── word.py
2、引入模块和申明文件路径
import mammothimport mammoth.transformsimport osfrom docx import Documentfrom bson import json_utilimport zipfileimport jsonimport unidecodeimport requestsguidUrl = "https://my.phrplus.com/REST/guid"inputPath = '/Users/admin/cwell/parser/docfiles/'imgPath = "/Users/admin/cwell/parser/imgs/"outputFile = '/Users/admin/cwell/parser/output/output.json'
mammoth: 核心组件,用来做转化工作
docx: 另一个做转化工作的模块,用来补充mammoth
os: 用来在系统中读取写入文件
zipfile: 用来解压word文档以提取图片
json: 用来把数据转化成json
bson: 用来配置写入json文件
unicode:用来处理字符
requests:用来调用api
3、转换单个文件
styleMap = """p[style-name='Title'] => h1.hidep[style-name='Subhead 1'] => h3p[style-name='List Bullet'] => ul.first > li:freshp[style-name='List Bullet 2'] => ul.second > li:freshp[style-name='Hyperlink']=>a.link"""def convert_image(image):return {"src":""}def parseFile(f):document = Document(inputPath+f)article = {"Title":document.core_properties.title,"Content":""}with open(inputPath+f,"rb") as docFile:html = mammoth.convert_to_html(docFile,style_map=styleMap,convert_image=mammoth.images.img_element(convert_image))decoded = unidecode.unidecode(html.value)if not article["Title"]:for para in document.paragraphs:if para.style.name == 'Title':if para.text:article["Title"] = para.textarticle["Content"]=decodedreturn article
parseFile就是核心功能了。传递进来的参数f是文件名,和文件路径合在一起能够帮我们准确定位要转化的文件。首先用docx找到文档的标题,并创建一个dictionary,里面包含标题和内容。然后用mammoth转化整个文件。注意命令中要用到stylemap和convertimage。前者用来规定转化规则:'style-name'是word里的式样名称,用word打开文档,点击任意一个元素可以查看其式样名称;这里规定标题转化为h1,副标题转化为h2等等。关于列表的转化规则这里就不详细叙述了,具体可以参考下面的文章:
参考链接
Converting docx to clean HTML: handling the XML structure mismatch
'convert_image' 是用来规定图片的转化方式的,由于我准备之后批处理所有文档中的图片,在这里就告诉程序不储存任何图片信息。但是于此同时保留图片的img tag以便标注图片在文档中的位置。如果不规定任何转化方式,生成的html里面会包含一大长串base64的图片信息。
mammoth转化出来的html是含有unicode的,不知道为什么python里跑一直报错,就用unicode解码了一下。
这之后,如果前面的程序没有抓取到文档标题,用docx换个姿势再抓取一下。
最后返回article这个dictionary。
4、抓取图片
def extractImage(f):ziped = zipfile.ZipFile(inputPath+f)allFiles = ziped.namelist()imgs = filter(lambda x: x.startswith('word/media/'), allFiles)imgNameArr = []for img in imgs:res = requests.post(guidUrl)if res.status_code is 200:guid = res.textdata = ziped.read(img,imgPath)idxStr = os.path.basename(img).split(".")[0][-1:]imgDict = {}imgDict["index"] = int(idxStr)-1imgDict["fileName"] = guid+".jpg"imgNameArr.append(imgDict)targetPath = os.path.join(imgPath,guid+".jpg")target = open(targetPath,"wb")target.write(data)target.close()ziped.close()return imgNameArr
没想到word文档其实是一个压缩文件吧?如果直接把word文档的后缀名改成zip然后再用解压软件查看,会看到一个media文件夹,里面就包含所有插入的图片。
用ziped读取文档,然后找到存放图片的media文件夹,每一个图片重新用guid命名,生成一个dictionary,里面包含的信息有“此图片在文档中出现的顺序”和文件名。话说media中的图片都被按照顺序重新命名为image1.png, image2.png,刚好为我们抓取顺序信息提供了方便。
(python也有生成guid的模块,我在这里调用api有点多此一举,但是为了和项目中其他图片需要用到的uuidv4保持一致还是用了)
之后就是把图片存在‘imgs’这个文件夹下。
5、生成json
def processDocs(path):result = []for f in os.listdir(path):if not f.startswith('.'):imgNameArr = extractImage(f)article = parseFile(f)fileName = os.path.basename(f)contentArr = article["Content"].split("<img")for idx, section in enumerate(contentArr):for info in imgNameArr:if idx is info["index"]:contentArr[idx] = section+"<img alt='"+info["fileName"]+"' data-fileName='"+info["fileName"]+"'"article["Content"] = ''.join(contentArr)result.append(article)with open(outputFile,'w+') as f:json.dump(result,f,default=json_util.default)
最后要用到的一个function就是写个循环挨个处理docfiles文件夹底下的文件了。针对每一个文件,记得把之前生成的图片信息的数组map到html里,然后在写入到json文件里就大功告成了!
indd转化为html
话说,到现在为止,我还没有找到一个完美的解决方案。我使用了相同的思路,把indd先批量生成为pdf(有一个indesign 脚本就是专门批量转化pdf的),然后用了一个叫做layout_scanner的github项目抓取pdf信息并转化为html。最后生成的html包含了文字和图片,但是图标和排版就保存不下来了。客户大大表示不满意。我也很惆怅啊!机智的小伙伴们如果有更好的思路请务必告诉我!如果需要我详细说明一下这一块内容,我会更新在这篇文章中。
用Python将word文件转换成html(转)的更多相关文章
- Python: 把txt文件转换成csv
最近在项目上需要批量把txt文件转成成csv文件格式,以前是手动打开excel文件,然后导入txt来生产csv文件,由于这已经变成每周需要做的事情,决定用python自动化脚本来实现,思路: 读取文件 ...
- 通过python将xml文件转换成html文件
#数据类型的转换 def main(): maxwidth = 100 #用于规范字段的长度 print_start() count=0 while True: ...
- 利用 Aspose.Words 组件,在不依赖与 Office 组件的情况下把 Word 文件转换成 HTML 代码。
首先利用 Nuget 获取 Aspose.Words.dll public ActionResult AsposeWordsDemo() { string srcFileName = Server.M ...
- 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
- ABBYY将JPEG文件转换成Word文档的方法
日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...
- 自制 Python小工具 将markdown文件转换成Html文件
今天看到了一个Python库,名为markdown.瞬间就给了我一个灵感,那就是制作一个将markdown文件转换成html文件的小工具. 我的实验环境 操作系统: Windows 7 64位 旗舰版 ...
- 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...
- 小白学习Python之路---py文件转换成exe可执行文件
一.背景 今天闲着无事,写了一个小小的Python脚本程序,然后给同学炫耀的时候,发现每次都得拉着其他人过来看着自己的电脑屏幕,感觉不是很爽,然后我想着网上肯定有关于Python脚本转换成可执行文件的 ...
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
随机推荐
- Ubuntu和win双系统删除ubuntu开机出错
Ubuntu和win双系统删除ubuntu开机出错问题. 报错error:unknown filesystem. grub rescue>_ 很简单: 进入pe 打开diskgenius 选择你 ...
- 使用反相器的rc振荡电路
多谐振荡器是一种自激振荡电路,该电路在接通电源后无需外接触发信号就能产生一定频率和幅值的矩形脉冲波或方波.由于多谐振荡器在工作过程中不存在稳定状态,故又称为无稳态电路. 一.门电路组成的多谐振荡器 1 ...
- 使用 commander && inquirer 构建专业的node cli
备注: 比较简单就是使用nodejs 的两个类库帮助我们进行开发而已,具体的使用参考类库文档 1. 项目初始化 a. 安装依赖 yarn init -y yarn add commander in ...
- 40+个对初学者非常有用的PHP技巧
1.不要使用相对路径,要定义一个根路径 这样的代码行很常见: require_once('../../lib/some_class.php'); 这种方法有很多缺点: 它首先搜索php包括路径中的指定 ...
- QT4.8.6静态编译
下载源安装程序,http://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz 解压 cd 进 ...
- 在Centos中yum安装和卸载软件的使用方法(转)
在Centos中yum安装和卸载软件的使用方法 安装方法 安装一个软件时 yum -y install httpd 安装多个相类似的软件时 yum -y install httpd* 安装多个非类似软 ...
- Spring注入方式及用到的注解
注入方式: 把DAO实现类注入到service实现类中,把service的接口(注意不要是service的实现类)注入到action中,注 入时不要new 这个注入的类,因为spring会自动注入,如 ...
- Apache + Tomcat + 连接器JK
一 安装Apache 下载apache: https://www.apache.org/ -> http://mirrors.cnnic.cn/apache/ -> http:// ...
- UCML 2.0 For ASP.NET开发平台简介
互联网时代,我们能跟上网络变革的步伐吗?我们的产品领先于竞争对手吗?我们能够满足日益个性化的客户需求吗? 采用新的软件开发方法是我们的首要选择. 第一个全面支持ASP.NET的应用框架开发平台诞生了— ...
- 安卓笔记-adb指令、打包安装
adb install -r -s xxx.apk -r重装 -s 安装到sd卡 安装软件 adb uninstall -k 包名 -k 只卸载程序不清除数据 adb ...