用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里写转化程序。

  1. ├── docfiles

  2. ├── imgs

  3. ├── inddfiles

  4. ├── output

  5. └── pdfs

  6. └── word.py

2、引入模块和申明文件路径

  1. import mammoth

  2. import mammoth.transforms

  3. import os

  4. from docx import Document

  5. from bson import json_util

  6. import zipfile

  7. import json

  8. import unidecode

  9. import requests

  10. guidUrl = "https://my.phrplus.com/REST/guid"

  11. inputPath = '/Users/admin/cwell/parser/docfiles/'

  12. imgPath = "/Users/admin/cwell/parser/imgs/"

  13. outputFile = '/Users/admin/cwell/parser/output/output.json'

mammoth: 核心组件,用来做转化工作

docx: 另一个做转化工作的模块,用来补充mammoth

os: 用来在系统中读取写入文件

zipfile: 用来解压word文档以提取图片

json: 用来把数据转化成json

bson: 用来配置写入json文件

unicode:用来处理字符

requests:用来调用api

3、转换单个文件

  1. styleMap = """

  2. p[style-name='Title'] => h1.hide

  3. p[style-name='Subhead 1'] => h3

  4. p[style-name='List Bullet'] => ul.first > li:fresh

  5. p[style-name='List Bullet 2'] => ul.second > li:fresh

  6. p[style-name='Hyperlink']=>a.link

  7. """

  8. def convert_image(image):

  9.    return {

  10.        "src":""

  11.    }

  12. def parseFile(f):

  13.    document = Document(inputPath+f)

  14.    article = {"Title":document.core_properties.title,"Content":""}

  15.    with open(inputPath+f,"rb") as docFile:

  16.        html = mammoth.convert_to_html(docFile,style_map=styleMap,convert_image=mammoth.images.img_element(convert_image))

  17.        decoded = unidecode.unidecode(html.value)

  18.    if not article["Title"]:

  19.        for para in document.paragraphs:

  20.            if para.style.name == 'Title':

  21.                if para.text:

  22.                    article["Title"] = para.text

  23.    article["Content"]=decoded

  24.    return article  

parseFile就是核心功能了。传递进来的参数f是文件名,和文件路径合在一起能够帮我们准确定位要转化的文件。首先用docx找到文档的标题,并创建一个dictionary,里面包含标题和内容。然后用mammoth转化整个文件。注意命令中要用到stylemap和convertimage。前者用来规定转化规则:'style-name'是word里的式样名称,用word打开文档,点击任意一个元素可以查看其式样名称;这里规定标题转化为h1,副标题转化为h2等等。关于列表的转化规则这里就不详细叙述了,具体可以参考下面的文章:

参考链接

  1. 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、抓取图片

  1. def extractImage(f):

  2.    ziped = zipfile.ZipFile(inputPath+f)

  3.    allFiles = ziped.namelist()

  4.    imgs = filter(lambda x: x.startswith('word/media/'), allFiles)

  5.    imgNameArr = []

  6.    for img in imgs:

  7.        res = requests.post(guidUrl)

  8.        if res.status_code is 200:

  9.            guid = res.text

  10.            data = ziped.read(img,imgPath)

  11.            idxStr = os.path.basename(img).split(".")[0][-1:]

  12.            imgDict = {}

  13.            imgDict["index"] = int(idxStr)-1

  14.            imgDict["fileName"] = guid+".jpg"

  15.            imgNameArr.append(imgDict)

  16.            targetPath = os.path.join(imgPath,guid+".jpg")

  17.            target = open(targetPath,"wb")

  18.            target.write(data)

  19.            target.close()

  20.    ziped.close()

  21.    return imgNameArr

没想到word文档其实是一个压缩文件吧?如果直接把word文档的后缀名改成zip然后再用解压软件查看,会看到一个media文件夹,里面就包含所有插入的图片。

用ziped读取文档,然后找到存放图片的media文件夹,每一个图片重新用guid命名,生成一个dictionary,里面包含的信息有“此图片在文档中出现的顺序”和文件名。话说media中的图片都被按照顺序重新命名为image1.png, image2.png,刚好为我们抓取顺序信息提供了方便。

(python也有生成guid的模块,我在这里调用api有点多此一举,但是为了和项目中其他图片需要用到的uuidv4保持一致还是用了)

之后就是把图片存在‘imgs’这个文件夹下。

5、生成json

  1. def processDocs(path):

  2.    result = []

  3.    for f in os.listdir(path):

  4.        if not f.startswith('.'):

  5.            imgNameArr = extractImage(f)

  6.            article = parseFile(f)

  7.            fileName = os.path.basename(f)

  8.            contentArr = article["Content"].split("<img")

  9.            for idx, section in enumerate(contentArr):

  10.                for info in imgNameArr:

  11.                    if idx is info["index"]:

  12.                        contentArr[idx] = section+"<img alt='"+info["fileName"]+"' data-fileName='"+info["fileName"]+"'"

  13.            article["Content"] = ''.join(contentArr)

  14.            result.append(article)

  15.    with open(outputFile,'w+') as f:

  16.        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包含了文字和图片,但是图标和排版就保存不下来了。客户大大表示不满意。我也很惆怅啊!机智的小伙伴们如果有更好的思路请务必告诉我!如果需要我详细说明一下这一块内容,我会更新在这篇文章中。

转载于:https://www.cnblogs.com/wumingxiaoyao/p/8241796.html

用Python将word文件转换成html(转)相关推荐

  1. python word处理_妙用Python将word文件转换成html 方法超简单

    什么方法可以将word文件转换成html,找了一圈,没有发现合适的应用可以把word或indd转化成干净的html.机缘巧合,无意间听说python很擅长文本处理,用Python将word文件转换成h ...

  2. 用Python将word文件转换成html

    序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上.客户大大说,要智能推送!要掌握节奏!要深度学习!要让用户留恋网站无法自拔! 话说符合以上特点的我也 ...

  3. 用Python批处理将WORD文件转换成PDF格式(工具:win32com模块)

    用Python批处理将WORD文件转换成PDF格式 一.问题分析 key words:批处理.WORD转换PDF.办公自动化 二.材料准备 三.代码实现 ☆其他问题:日常遇到问题,整理笔记不易,欢迎交 ...

  4. Acrobat如何将word文件转换成pdf格式

    很多朋友电脑装了Adobe Acrobat,却不知道Acrobat如何将word文件转换成pdf格式,现在就给大家讲解一下.比如,我们电脑安装Adobe Acrobat  Professional 7 ...

  5. 快速将Word文件转换成PPT的方法

    日常办公中,Word格式的文件应该是我们使用频率最高的,平时接收文件也会遇到过PPT文件,但是PPT演示文档一般是用来做汇报的,用在各种会议中,或者是讲堂上.大家都觉得做PPT麻烦,需要填充很多内容, ...

  6. 将word文件转换成PDF的两种方法

    由于工作需要,使用了两种方式实现了word文件转PDF的功能.以下的程序是我使用VB6编写,供大家参考. 第一种方法,使用PDFMAKERAPILib,使用这种方法,可以设置文件的安全性.这种方式是A ...

  7. Python中将字节流文件转换成图片文件

    Python中将字节流文件转换成图片文件 import urllib3 import os #PIL图像处理标准库 from PIL import Image from io import Bytes ...

  8. Python将PDF文件转换成PNG的方案

    2019独角兽企业重金招聘Python工程师标准>>> 目前最靠谱的是基于 mupdf 的 Python 绑定:  https://github.com/rk700/PyMuPDF ...

  9. 使用python将doc的word文件转换成docx文件

    文章目录 一.学习目标: 二.直接转换代码: 一.学习目标: 主要之前使用python提起word的docx的文件的数据.但是今天发现,如果是doc后缀的word文件,会报错,这样就无法提取数据了,然 ...

最新文章

  1. amh支持java吗_跟我学Android之三 常用视图
  2. BZOJ 2134 单选错位(数学期望)【BZOJ 修复工程】
  3. terminal怎么运行c语言文件,在mac电脑的terminal里该如何运行c语言
  4. 1.10 字符串的替换(replace()、replaceFirst()和replaceAll())
  5. OutOfMemoryError:Java堆空间–分析和解决方法
  6. python读取sqlserver的数据_Python:使用并发未来进程P读取sqlserver数据
  7. bzoj1303[CQOI2009]中位数图
  8. 12个数据分析里最常用的思维定式,收藏起来吃灰
  9. oracle数据库tx锁,oracle数据库有把TX锁,如何定位锁在哪?
  10. Android基础进阶
  11. ASP.NET随机显示数据库记录
  12. 关于JavaScript DOM 编程艺术这本书
  13. 基于c#的海量图片查重去重
  14. kettle与MySQL数据库建立连接教程
  15. oracle开机启动监听,配置Oracle数据库和监听随Linux系统自启动
  16. 回溯算法 允许重复选择元素的组合
  17. 数据结构单链表——一元多项式求和(C语言版)
  18. MATLAB_心形线的创建
  19. cad图纸问号怎么转换文字_cad打开后图形文字显示问号该怎么办?
  20. 中国石油大学(华东)计算机与通信工程学院,2019年中国石油大学(华东)计算机与通信工程学院考研复试分数线...

热门文章

  1. 面向初学者的蒙特卡洛树搜索MCTS详解及其实现
  2. 计算机科学怎么撤稿,科学网-那些发生过大型撤稿事件的期刊,现在还好吗?-傅慧真的博文...
  3. 城市新56族 你是哪一族?
  4. WannaCry蠕虫分析与预防
  5. linux服务器time wait,Linux服务器TIME_WAIT进程的解决与原因
  6. 源码安装OpenStack Ussuri ---Keystone篇
  7. 王*诺《会飞的木耳》
  8. DOS/BAT批处理if exist else 语句的几种用法
  9. 以太坊简史--俄罗斯少年成 “神” 之路
  10. 计算机存储为什么用二进制,计算机为什么使用二进制存储数据?