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


原文发布时间为:2018-01-07

本文作者:栗子君

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”微信公众号


相关文章
|
28天前
|
XML 数据格式 Python
从手动编辑到代码生成:Python 助你高效创建 Word 文档
本文介绍如何用Python实现Word文档自动化生成,结合python-docx、openpyxl和matplotlib库,高效完成报告撰写、数据插入与图表生成,大幅提升办公效率,降低格式错误,实现数据驱动的文档管理。
309 2
|
2月前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
866 2
|
1月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
|
3月前
|
缓存 数据可视化 Linux
Python文件/目录比较实战:排除特定类型的实用技巧
本文通过四个实战案例,详解如何使用Python比较目录差异并灵活排除特定文件,涵盖基础比较、大文件处理、跨平台适配与可视化报告生成,助力开发者高效完成目录同步与数据校验任务。
144 0
|
4月前
|
XML Linux 区块链
Python提取Word表格数据教程(含.doc/.docx)
本文介绍了使用LibreOffice和python-docx库处理DOC文档表格的方法。首先需安装LibreOffice进行DOC到DOCX的格式转换,然后通过python-docx读取和修改表格数据。文中提供了详细的代码示例,包括格式转换函数、表格读取函数以及修改保存功能。该方法适用于Windows和Linux系统,解决了老旧DOC格式文档的处理难题,为需要处理历史文档的用户提供了实用解决方案。
360 0
|
4月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
3月前
|
监控 Linux 数据安全/隐私保护
Python实现Word转PDF全攻略:从入门到实战
在数字化办公中,Python实现Word转PDF自动化,可大幅提升处理效率,解决格式兼容问题。本文详解五种主流方案,包括跨平台的docx2pdf、Windows原生的pywin32、服务器部署首选的LibreOffice命令行、企业级的Aspose.Words,以及轻量级的python-docx+pdfkit组合。每种方案均提供核心代码与适用场景,并涵盖中文字体处理、表格优化、批量进度监控等实用技巧,助力高效办公自动化。
815 0
|
4月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
903 0
|
4月前
|
数据管理 开发工具 索引
在Python中借助Everything工具实现高效文件搜索的方法
使用上述方法,你就能在Python中利用Everything的强大搜索能力实现快速的文件搜索,这对于需要在大量文件中进行快速查找的场景尤其有用。此外,利用Python脚本可以灵活地将这一功能集成到更复杂的应用程序中,增强了自动化处理和数据管理的能力。
317 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
258 102

热门文章

最新文章

推荐镜像

更多