文章目录

  • Mammoth
    • 安装
    • 使用
      • CLI
        • images
        • styles
        • Markdown
        • 基本转换
        • 自定义样式映射
        • 自定义图像处理程序
        • 粗体
        • 斜体
        • 下划线
        • 删除线
        • 注释
      • API
        • message
        • 图片转换器
        • 文档转换
    • 编写样式映射配置
      • 新建元素
      • 文档元素匹配器
      • HTML路径
        • 单一元素
        • 分离器
        • 嵌套元素

Mammoth

官方

Mammoth可用于将.docx文档(比如由Microsoft Word创建的)转换为HTML。Mammoth致力于通过文档中的语义信息生成简洁的HTML,而忽略一些其他细节。例如,Mammoth会把带有“Heading 1”样式的所有段落转换为“h1”元素,而不是试图精确地复制标题的所有样式(字体、字号、颜色等)。

.docx使用的结构与HMTL的结构有很多不匹配的地方,这意味着复杂文档的转换很难达到完美。但如果你仅使用样式进行文档的语义化标记,Mammoth将会工作得很好。

当前支持如下特性:

- 标题。
- 列表。
- 自定义从.docx样式到HTML的映射。比如,通过提供合适的样式映射,可以把“WarningHeading”样式转换为“h1.warning”类。
- 表格。表格自身的样式——比如边框——目前会被忽略,但对文本格式的处理与文档的其余部分一致。
- 脚注和尾注。
- 图像。
- 粗体、斜体、下划线、删除线、上标和下标。
- 链接。
- 换行。
- 文本框。文本框中的内容作为一个单独的段落处理,放在包含该文本框的段落之后。

安装

pip install mammoth

支持的其他平台

- JavaScript,包括浏览器和node.js。可从npm上获取。
- Python。可从PyPI上获取。
- WordPress。
- Java/JVM。可从Maven Central上获取。

使用

CLI

您可以通过将路径传递给docx文件和输出文件来转换docx文件。例如:

mammoth document.docx output.html

如果未指定输出文件,则输出将写入stdout。
输出是一个HTML片段,而不是用UTF-8编码的完整HTML文档。由于未在片段中显式设置编码,因此如果浏览器未默认为UTF-8,则在Web浏览器中打开输出文件可能会导致Unicode字符被错误地呈现。

images

默认情况下,图像包含在输出HTML中。如果使用了--output-dir指定了输出目录,则会将图像写入单独的文件。若是文件已存在则被重写覆盖。例如:

mammoth document.docx --output-dir=output-dir

styles

可以使用--style-map从文件中读取自定义样式映射。例如

mammoth document.docx output.html --style-map=custom-style-map

其中,custom-style-map类似如下

p[style-name='Aside Heading'] => div.aside > h2:fresh
p[style-name='Aside Text'] => div.aside > p:fresh

Markdown

使用--output-format=markdown会产生Markdown格式

Markdown支持仍处于早期阶段,因此您可能会发现某些功能不受支持

mammoth document.docx --output-format=markdown

基本转换

要将一个已经存在的.docx文件转换为HTML,将类文件对象传递给mammoth.convert_to_html,该文件应以二进制模式打开。例如:

import mammothwith open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file)html = result.value # The generated HTMLmessages = result.messages # Any messages, such as warnings during conversion

您还可以使用mammoth.extract_raw_text提取文档的原始文本。这将忽略文档中的所有格式。每个段落后跟两个换行符。

with open("document.docx", "rb") as docx_file:result = mammoth.extract_raw_text(docx_file)text = result.value # The raw textmessages = result.messages # Any messages

自定义样式映射

默认情况下,Mammoth把一些普通的.docx样式映射为HTML元素。比如,带有名为Heading 1的样式的一个段落会被转换为一个h1元素。您可以通过将带有style_map属性的options对象作为convert_to_html的第二个参数传递来传递样式的自定义映射。关于样式映射语法的描述包含在“编写样式映射配置”一节中。例如,将带有名为Section Title的样式的段落转换为h1元素,带有名为Subsection Title的样式的段落转换为h2元素:

import mammothstyle_map = """
p[style-name='Section Title'] => h1:fresh
p[style-name='Subsection Title'] => h2:fresh
"""with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

用户定义的样式映射优先于默认样式映射使用。要完全停止使用默认样式映射,请传递include_default_style_map = False

result = mammoth.convert_to_html(docx_file, style_map=style_map, include_default_style_map=False)

自定义图像处理程序

默认情况下,图像将转换为<img>元素,并且源包含在src属性中。通过将convert_image参数设置为图像转换器可以更改此行为。

例如,以下内容将复制默认行为

def convert_image(image):with image.open() as image_bytes:encoded_src = base64.b64encode(image_bytes.read()).decode("ascii")return {"src": "data:{0};base64,{1}".format(image.content_type, encoded_src)}mammoth.convert_to_html(docx_file, convert_image=mammoth.images.img_element(convert_image))

粗体

默认情况下,粗体文本被包装在<strong>标签中。可以通过添加对b的样式映射改变这种行为。比如,要把粗体文本包装在<em>标签中:

style_map = "b => em"with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

斜体

默认情况下,斜体文本被包装在<em>标签中。可以通过添加对i的样式映射改变这种行为。比如,要把斜体文本包装在<strong>标签中:

style_map = "i => strong"with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

下划线

默认情况下,由于会与HTML文档中的链接引起混淆,所有文本的下划线均被忽略。可以通过添加对u的样式映射改变这种行为。比如,有一个源文档使用下划线表示强调。下面的代码会把所有带显式下划线的源文本包装在<em>标签中:

import mammothstyle_map = "u => em"with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

删除线

默认情况下,带删除线的文本被包装在<s>标签中。可以通过添加对strike的样式映射改变这种行为。比如,要把带删除线的文本包装在<del>标签中:

style_map = "strike => del"with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

注释

默认情况下,注释是被忽略的。为comment-reference添加一个类型映射,可以将注释生成在HTML中。

注释将附加到文档的末尾,并带有使用指定样式映射包装的注释的链接。

style_map = "comment-reference => sup"with open("document.docx", "rb") as docx_file:result = mammoth.convert_to_html(docx_file, style_map=style_map)

API

name Desc
mammoth.convert_to_html(fileobj, **kwargs) 将源文档转换为html
mammoth.convert_to_markdown(fileobj, **kwargs) 将源文档转换为Markdown。这与convert_to_html的行为相同,只是结果的value属性包含Markdown而不是HTML。
mammoth.extract_raw_text(fileobj) 提取文档的原始文本。这将忽略文档中的所有格式。每个段落后跟两个换行符
mammoth.embed_style_map(fileobj, style_map) 将样式贴图style_map嵌入到fileobj中。当Mammoth读取文件对象时,它将使用嵌入式样式图。

message

每个消息都有如下属性

name Desc
type 表示消息类型的字符串,例如“warning”
message 包含实际消息的字符串

图片转换器

可以通过调用mammoth.images.img_element(func)来创建图像转换器。这会为原始docx中的每个图像创建一个<img>元素。func应该是一个具有一个参数图像的函数。此参数是要转换的图像元素,并具有以下属性:

open()                打开图像文件。返回类文件对象。
content_type    图像的内容类型,如image/png

func应该返回<img>元素的属性的dict。至少,这应该包括src属性。如果找到图像的任何替代文本,则会自动将其添加到元素的属性中。

例如,以下内容复制默认图像转换:

def convert_image(image):with image.open() as image_bytes:encoded_src = base64.b64encode(image_bytes.read()).decode("ascii")return {"src": "data:{0};base64,{1}".format(image.content_type, encoded_src)}mammoth.images.img_element(convert_image)

mammoth.images.data_uri是默认图像转换器

Mammoth默认不处理WMF图像。处理内容目录包含如何使用LibreOffice转换它们的示例,尽管转换的保真度完全取决于LibreOffice。

文档转换

用于文档转换的API应被视为不稳定,并且可能在任何版本之间发生变化。如果您依赖此行为,则应该固定特定版本的Mammoth,并在更新前仔细测试。
Mammoth允许文档在转换之前进行修正。例如,假设文档没有进行语义标记,但您知道任何中心对齐的段落应该是标题。您可以使用transform_document参数来适当地修改文档:

import mammoth.transformsdef transform_paragraph(element):if element.alignment == "center" and not element.style_id:return element.copy(style_id="Heading2")else:return elementtransform_document = mammoth.transforms.paragraph(transform_paragraph)mammoth.convert_to_html(fileobj, transform_document=transform_document)

或者,如果您希望已明确设置的段落使用等宽字体来表示代码:

import mammoth.documents
import mammoth.transforms_monospace_fonts = set(["courier new"])def transform_paragraph(paragraph):runs = mammoth.transforms.get_descendants_of_type(paragraph, mammoth.documents.Run)if runs and all(run.font and run.font.lower() in _monospace_fonts for run in runs):return paragraph.copy(style_id="code", style_name="Code")else:return paragraphconvert_to_html(fileobj,transform_document=mammoth.transforms.paragraph(transform_paragraph),style_map="p[style-name='Code'] => pre:separator('\n')",
)
name desc
mammoth.transforms.paragraph(transform_paragraph) 返回一个可用作transform_document参数的函数。这将将函数transform_paragraph应用于每个段落元素。transform_paragraph应返回新段落。
mammoth.transforms.run(transform_run) 返回一个可用作transform_document参数的函数。这将将函数transform_run应用于每个run元素。transform_run应该返回新的运行。
mammoth.transforms.get_descendants(element) 获取元素的所有后代。
mammoth.transforms.get_descendants_of_type(element, type) 获取特定类型元素的所有后代。例如,要获取元素段落中的所有运行

示例

import mammoth.documents
import mammoth.transformsruns = mammoth.transforms.get_descendants_of_type(paragraph, documents.Run)

编写样式映射配置

一个样式映射配置由几个使用换行符分隔的样式映射组成。空行和由“#”开始的行会被忽略。

一个样式映射由两部分组成:

- 箭头左侧为文档元素匹配器。
- 箭头右侧为HTML路径。

每转换一个段落,Mammoth会查找文档元素匹配器匹配该段落的第一个样式映射,然后Mammoth确保满足HTML路径。

新建元素

当编写样式映射时,理解Mammoth中关于新建元素的概念是很有用的。在生成HTML的时候,Mammoth仅在必要的时候才会关闭一个HTML元素。否则,元素会被重用。

例如,有一个样式映射为p[style-name='Heading 1'] => h1。如果Mammoth遇到了一个包含名为Heading 1的样式的段落,这个段落会被转换为包含相同文本的h1元素。如果下一个段落也包含名为Heading 1的样式,那么这个段落的文本会被追加到已有的h1元素,而不是创建一个新的h1元素。

许多情况下,你可能希望生成一个新的“h1”元素。你可以通过使用“:fresh”修饰符指明这么做:

p[style-name='Heading 1'] => h1:fresh

然后两个连续的Heading 1段落会被转换为两个独立的“h1”元素。

当生成较为复杂的HTML结构的时候,重用元素就比较有用。例如,假设你的.docx文档包含旁注。每个旁注可能包含一个标题和一些正文文本,它们应该被包含在一个单独的“div.aside”元素中。这种情况下,类似于p[style-name='Aside Heading'] => div.aside > h2:freshp[style-name='Aside Text'] => div.aside > p:fresh的样式映射可能会有帮助。

文档元素匹配器

  • 段落、内联文本和表格

匹配所有段落:

p

匹配所有内联文本:

r

匹配所有表格

table

要匹配带有指定样式的段落、内联文本和表格,你可以通过名称引用样式,即显示在Microsoft Word或LibreOffice中的样式名称。比如,要匹配一个带有样式名Heading 1的段落:

p[style-name='Heading 1']

您还可以通过前缀匹配样式名称。例如,要匹配样式名称以标题开头的段落

p[style-name^='Heading']

也可以通过样式ID引用样式,即在.docx文件内部使用的ID。要匹配一个带有指定样式ID的段落或内联文本,追加一个点,后跟样式ID即可。比如,要匹配一个带有样式IDHeading1的段落:

p.Heading1
  • 粗体

匹配显式的粗体文本:

b

注意,这只会匹配显式地应用了粗体样式的文本,而不会匹配由于其所属段落或内联文本的样式而显示为粗体的文本。

  • 斜体

匹配显式的斜体文本:

i

注意,这只会匹配显式地应用了斜体样式的文本,而不会匹配由于其所属段落或内联文本的样式而显示为斜体的文本。

  • 下划线

匹配显式的下划线文本:

u

注意,这只会匹配显式地应用了下划线样式的文本,而不会匹配由于其所属段落或内联文本的样式而带有下划线的文本。

  • 删除线

匹配显式的删除线文本:

strike

注意,这只会匹配显式地应用了删除线样式的文本,而不会匹配由于其所属段落或内联文本的样式而带有删除线的文本。

  • 小型大写文字

明确匹配小型大写文字:

small-caps

请注意,这与已明确应用了小型大写字母的文本相匹配。由于其段落或运行样式,它不会匹配任何小型大写字母。

HTML路径

单一元素

最简单的HTML路径只指定单一元素。比如,要指定一个“h1”元素:

h1

要给元素指定一个CSS类,追加一个点,后跟类名即可:

h1.section-title

如果要求新建元素,使用“:fresh”:

h1:fresh

必须按正确顺序使用修饰符:

h1.section-title:fresh

分离器

要指定放置在折叠在一起的段落内容之间的分隔符,请使用:separator('SEPARATOR STRING')

例如,假设一个文档包含一段代码,其中每行代码都是一个带有代码块样式的段落。我们可以编写一个样式映射来将这些段落映射到<pre>元素:

p[style-name='Code Block'] => pre

由于pre未标记为:fresh,因此连续的``pre元素将被折叠在一起。但是,这会导致代码全部在一行上。我们可以使用separator`在每行代码之间插入一个换行符:

p[style-name='Code Block'] => pre:separator('\n')

嵌套元素

使用“>”指定嵌套元素。比如,要指定“h2”在“div.aside”中:

div.aside > h2

你可以嵌套任意深度的元素。

word转HTML-python第三方包Mammoth相关推荐

  1. python 第三方包自动导入_7行代码,彻底告别python第三方包import导入问题!

    最近有不少小伙伴咨询关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事. 随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能.但是,他 ...

  2. python怎么安装第三方库-vs2017怎么安装python第三方包

    vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...

  3. python怎么安装包-怎么在windows下安装python第三方包

    python第三方包的windows安装文件exe格式, 这上面有很多python第三方包的二进制安装文件,包括32位和64位的.下载安装就ok了! 这下面有很多python第三方包的二进制安装文件, ...

  4. mitmdump 脚本使用python第三方包方法(报错:in script xxx.py: No module named ‘xxx‘)

    本文仅供学习交流使用,如侵立删! mitmdump -s 调用py脚本时 加载python第三方包会报错 报错:in script xxx.py: No module named 'xxx' 解决方法 ...

  5. python第三方包的windows安装文件exe格式

    今天弄了一上午的python-ldap,发现要么安装vc,要么用其他比较麻烦的方法,都比较麻烦.幸好找到这个地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...

  6. Python第三方包-你了解numpy吗(numpy进阶)

    创建数组等基础操作见:Python第三方包-你了解numpy吗(numpy基础)_周先森爱吃素的博客-CSDN博客 索引和切片 基本切片:可以使用slice对象切片,也可以像python内置类型一样. ...

  7. windows10怎么安装python第三方库_怎么在windows下安装python第三方包

    python第三方包的windows安装文件exe格式, 这上面有很多python第三方包的二进制安装文件,包括32位和64位的.下载安装就ok了! 这下面有很多python第三方包的二进制安装文件, ...

  8. anaconda安装python包_Anaconda:安装或更新 Python 第三方包

    conda和pip简介 conda conda是包及其依赖项和环境的管理工具. 适用语言:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, F ...

  9. Python 第三方包的使用指南

    Python 第三方包的使用指南 Python 第三方包的使用指南 Numpy 查看ndarray数组中的非零最小项 数组复制 Scipy 计算距离矩阵 数学,物理常量和单位 cmath 直角坐标系和 ...

  10. 内网安装python第三方包_内网安装python第三方包

    内网快速安装python第三方包 内网安装包是一个很麻烦的问题,很多时候,内网的源会出现问题,导致无法安装. 这里给出一种快速在内网中安装第三方包,无需使用内网的源. 外网操作 1.根据开发环境下的所 ...

最新文章

  1. 「3D视觉从入门到精通」知识星球
  2. 【MySQL】MHA部署与MasterFailover代码分析
  3. 美学设计评价_死亡的孩子无法使用的设计美学
  4. java guava 使用_使用Guava操作基本类型
  5. code principles
  6. Android Studio 应用目录结构说明
  7. MYSQL练习题:访问日期之间最大的空档期
  8. protoc安装使用
  9. 交换机配置VLAN(思科模拟器实现)
  10. 关于CSS Reset 那些事(一)之 历史演变与Normalize.css
  11. bzoj 2827 千山鸟飞绝(treap)
  12. 写给小白的 Asyncio 教程
  13. matlab一维矩形积分,玩转matlab之一维 gauss 数值积分公式及matlab源代码
  14. 减少计算机视觉效果可以减少游戏卡顿吗,Win10玩游戏更流畅的几招优化方法(亲测有效)...
  15. 如何1分钟实现身份实名认证功能?
  16. android开发——用户头像
  17. linux清除历史linux清除history
  18. ibm服务器面板报警指示灯含意
  19. iOS-地理坐标转换,原生地图获取的原始坐标转换为地图真实坐标
  20. Excel导入sql

热门文章

  1. Bootstrap学习笔记——导航条、分页导航
  2. delphi 安卓图片保存数据库_delphi数据库存储图片
  3. c语言遍历json数组,JQuery遍历json数组的3种方法
  4. 通用智能面临巨大掣肘,国产AIGC还在寻找光明
  5. TK1镜像备份和恢复
  6. 在CentOS7.x版本上搭建Greenplum5.1.0数据库详细步骤讲解
  7. vue中静态资源文件中的图片element.style.backgroundImage设置url无效问题
  8. 程序员逛银饰店笑话一则
  9. Revit开发--创建立面
  10. 无法删除文件因为已经在Windows任务管理器打开