Python实现Word文档转换Markdown的示例


Posted in Python onDecember 22, 2020

随着SaaS服务的流行,越来越多的人选择在各个平台上编写文档,制作表格并进行分享。

同时,随着Markdown语法的破圈,很多平台开始集成支持这种简洁的书写标记语言,这样可以保证平台上用户文档样式的统一性。

但是在一些场景下,我们还是会在本地的Office软件上写有很多文档,或者历史遗留了很多本地文档。

如果我们需要将其上传到各大平台,直接复制粘贴,大概率是会造成文档内容结构和样式的丢失。于此我们需要将其转换为 Markdown 语法。

很多桌面软件(比如Typora)都提供了导入 Word 文件的功能,这类功能一般是通过 Pandoc 这个软件来扩展实现的。

Pandoc 是一个全能型的文档格式转换工具,其能够将多种文档格式转换为各类常见的文档格式。具体的文档格式之间的转换如下图所示(来源于官网):

Python实现Word文档转换Markdown的示例

Pandoc 是瑞士军刀一般的存在,能够较好的处理各类的文档格式转换,但是如果我们需要自己写程序,调用 Pandoc 则需要额外的安装 Pandoc 才行,并且也不方便自定义。

幸而,在 Python 中有很多第三方模块提供了此类文档格式的转换功能。今天,我们来实现一下比较频繁使用到的 Word 文档转 Markdown 文档。

转换逻辑

Word 文档到 Markdown 文档的转换总体而言分两步来实现:

  • 第一步,将 Word 文档转换为 HTML 文档;
  • 第二步,将 HTML 文档转换为 Markdown 文档;

依赖模块

要实现这个功能我们需要借助 Python 的两个第三方模块:

  • mammoth
  • markdownify

mammoth 是一个用于将 Word 文档转换为 HTML 的模块,它支持在 Python、JavaScript、Java、.Net等平台使用。而 markdownify 则是将 HTML 转换为 Markdown 文档的模块。

处理 Word 图片

因为 Word 文档中不可避免地会存在很多图片,为了在转换后的文档中能够正确地显示图片,我们需要自定义一下Word 文档内图片的处理方式。默认情况下,mammoth 会将图片转换为 base64 编码的字符串,这样不用生成额外的本地图片文件,但是会使文档体积变得很大。所以我们选择将图片另存为本地图片:

# 转存Word文档内的图片
def convert_img(image):
  with image.open() as image_bytes:
    file_suffix = image.content_type.split("/")[1]
    path_file = "./img/{}.{}".format(str(time.time()),file_suffix)
    with open(path_file, 'wb') as f:
      f.write(image_bytes.read())

  return {"src":path_file}

正式转换

在这里,我们以州的先生很久以前写的《Python爬虫实战与机器学习应用》(需要这本书的小伙伴可以微信私聊我)这本书的 Word 文档来演示。

Python实现Word文档转换Markdown的示例

代码如下所示:

# 读取Word文件
with open(r"F:\自媒体\Python爬虫实战与机器学习应用.docx" ,"rb") as docx_file:
  # 转化Word文档为HTML
  result = mammoth.convert_to_html(docx_file,convert_image=mammoth.images.img_element(convert_img))
  # 获取HTML内容
  html = result.value
  # 转化HTML为Markdown
  md = markdownify(html,heading_style="ATX")
  print(md)
  with open("./docx_to_html.html",'w',encoding='utf-8') as html_file,open("./docx_to_md.md","w",encoding='utf-8') as md_file:
    html_file.write(html)
    md_file.write(md)
  messages = result.messages

运行程序,最终生成2个文件:

  • docx_to_html.html
  • docx_to_md.md

其中,docx_to_html.html 是 Word 文档转换为 HTML 后的文档:

Python实现Word文档转换Markdown的示例

docx_to_md.md 是 HTML 转换为 Markdown 后的文档:

Python实现Word文档转换Markdown的示例

最后是另存为的图片:

Python实现Word文档转换Markdown的示例

怎么样,简单的二三十行代码就完成了 Word 到 Markdown 文档的转换,是不是很简单?

此功能将集成到觅道文档作为文档导入的功能实现,欢迎持续进行关注!

  文章版权所有:州的先生博客

  原文地址:https://zmister.com/archives/1601.html

以上就是Python实现Word文档转换Markdown的示例的详细内容,更多关于python Word文档转换Markdown的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Fabric 应用案例
Aug 28 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python实现的rsa加密算法详解
Jan 24 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
Python3实现的回文数判断及罗马数字转整数算法示例
Mar 27 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
python wxpython 实现界面跳转功能
Dec 17 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
Dec 25 Python
Python configparser模块配置文件过程解析
Mar 03 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 #Python
Django中ORM的基本使用教程
Dec 22 #Python
python通用数据库操作工具 pydbclib的使用简介
Dec 21 #Python
Python 多进程原理及实现
Dec 21 #Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 #Python
python 用pandas实现数据透视表功能
Dec 21 #Python
python 生成正态分布数据,并绘图和解析
Dec 21 #Python
You might like
索尼ICF-SW100收音机评测
2021/03/02 无线电
php中长文章分页显示实现代码
2012/09/29 PHP
php给每个段落添加空格的方法
2015/03/20 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
php实现文件预览功能
2017/05/23 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python3.2中Print函数用法实例详解
2015/05/19 Python
Python温度转换实例分析
2018/01/17 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
高中生的自我鉴定范文
2014/01/24 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
化工实习心得体会
2014/09/09 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL