本项目已不再更新。请查看 markdocx,一个跨平台,不依赖pandoc,更灵活地设置样式的 md 转 word 工具。
This repository is no longer updated. Please see markdocx, a cross-platform, pandoc-free markdown to word tool with flexible style settings.
一个使用 C#编写的、基于Pandoc的 markdown 转换 word 工具。其本质是在 Pandoc 的基础上提供一个 GUI 界面,方便操作。初学 C#和 Winform 的作品,还在摸索阶段,有更好的思路或找到了 bug 可以留 issue,我都会看到并且回复的 :)
注意!本项目还在开发当中,并且要求系统安装 Pandoc。已基本实现转换和样式保存导出功能,GUI 界面还未完成,目前阶段的使用方法见 使用方法
一般而言,我使用 Typora 编写 Markdown,而 Typora 中自带有导出 HTML 格式的功能。如果对文档中的代码高亮没有要求,可以通过以下步骤进行转换为 Word 文件,效果也还不错。
- Typora 中:文件 - 导出 - HTML(without Styles)。
一定要选 without style,这样导出的就是纯净的 HTML 文件
- 打开 HTML 文件,全选,复制
- 新建 Word 文档,粘贴(保留源样式)。到这就基本完成了,目录大纲级别也会被保留
- 如果需要,可以修改样式,比如全选减小字号、更换字体、行距等等
在接触了 markdown 之后,越发觉得 Word 调节样式非常繁琐了,但无奈平时的实验报告又不得不上交 Word 版本,转了一圈也没有找到一个好用的 markdown 转 word 工具。而 Pandoc 默认的 Word 样式在中文状态下不美观,于是萌生了编写此工具的想法。
- 由.md 文件转换为一个排版样式尚可的 Word 文档。转换出的 Word 的字符、段落样式符合中文的书写和显示习惯(如段首缩进、行间距、字体的选择等)
- 段落样式可供设置的内容:字号、字体、段落间距、颜色、(加粗、斜体、下划线?)等
- 提供可视化界面,样式可由用户方便地设置
- 拖拽即可导入文件
- 软件自带有若干个样式预设
- 可以保存预设,可以导入、导出样式预设
- 读取 md 文件的 yaml 信息来进行自动样式设置
- 提供论文排版模式,即在首页之前添加特定的封面、处理参考文献等
- 根据 MD 的大纲级别制作目录
- 制作一个精简版的 pandoc 依赖,只需要其中的 md 转换 docx 的功能,从而简化软件体积
注意,要求系统已安装Pandoc。测试所用的版本为 2.7.2,理论上更高版本也可行,但未测试。
测试阶段,未来应该会完善 :)
- 前往Release页面下载 zip 并解压,运行其中的 exe 文件
- 拖入
.md
文件到窗口中 - 下拉菜单选择预设,或修改样式
- 执行转换
- 转换出的 docx 文件将保存在与源 md 的同目录下
可对该 xml 文件进行修改,以满足自己的样式需求。
有更好的思路、方法可以留 issue,我会看到的
-
关键:根据用户的样式设置,生成一个可供 pandoc 转换时使用的临时
template.docx
——使用 Office Open XML SDK 操作- 创建一个新的临时的 docx
- 根据 pandoc 参照模板,生成若干段落样式
- 向临时的 docx 中添加这些段落样式
- 保存并关闭这个 docx
-
调用 pandoc。使用以下命令:
pandoc -o output.docx input.md --reference-doc=template.docx
解释:由源 md 文件
input.md
参照template.docx
中的样式列表生成 Word 文档output.docx
。 -
使用 JSON 或 XML 保存样式预设,用于导入和导出分享、保存样式信息
string path = @"C:\Users\59838\Desktop\test.docx";
// 1.创建一个新的临时的docx
CreateWordprocessingDocument(path);
// 2.打开刚刚创建的新文档
WordprocessingDocument wordDocument =
WordprocessingDocument.Open(path, true);
// 3.获取样式定义部分实例
StyleDefinitionsPart part = GetStyleDefinitionsPart(wordDocument);
// 4.根据要求生成样式Style实例
Style style = GenerateStyle();
// 5.将4中生成的实例,通过3获取的实例,添加到样式管理(文档的样式库)中
AddParagraphStyle(part, style);
// 6.将更改保存并关闭文件(重要)
wordDocument.Close();
Pandoc 转换时参考的样式,要求 StyleName 和 StyleId 两个属性共同满足其给出的模板中对应的样式名称和 ID
样式名 | 描述 | 必须 |
---|---|---|
Normal | 默认文本。在有序列表中会使用该样式,一般和 Body Text 一致并禁用首行缩进 | 是 |
Body Text | 正文文本。在正文段落中应用 | 是 |
First Paragraph | 段落首段,一般和 Body Text 一样即可,在段落的第一行应用 | 是 |
Compact | 在无序列表中应用 | 是 |
Heading 1 | 一级标题 | 是 |
Heading 2 | 二级标题 | 是 |
Heading 3 | 三级标题 | 是 |
Heading 4 | 四级标题 | 否 |
Block Text | 引用块文字 | 是 |
更多:
- Heading 5
- Heading 6
- Heading 7
- Heading 8
- Heading 9
- Footnote Text“脚注文字,可选
- Definition Term:未知
- Definition:未知
- Caption:未知
- Table Caption:表的的注释,可选
- Image Caption:图片的注释,可选
- Figure:未知,可能是图表
- Captioned Figure:未知,可能是带标题的图表
- TOC Heading:目录标题
- Title:标题,可选
- Subtitle:副标题,可选
- Author:作者,可选
- Date:日期,可选
- Abstract:未知,可选
- Bibliography:参考文献,可选,具体使用未知
样式名称 | 描述 | 必须 |
---|---|---|
Default Paragraph Font | 默认段落字体 | 是 |
Body Text Char | 正文字体 | 是 |
Verbatim Char | 等宽字体(在代码块中用到) | 是 |
Footnote Reference | 脚注引用字体样式 | 否 |
Hyperlink | 超链接字符样式 | 是 |
- Table:待补充
-
必需:WindowsBase(.NET Framework 自带)
-
必需:Open XML SDK 2.5 for Microsoft Office
-
可选:OpenXMLSDKTool,用于查看 Word 文档中的各项内容
[主要] Office Open XML SDK 字处理 概述
https://docs.microsoft.com/zh-cn/office/open-xml/word-processing?view=openxml-2.8.1
记录使用 SDK 操作 Word 时,一些取值的换算方式。一般而言,默认字体大小、行距大小的单位都是磅。
行距倍数 | 设置值 |
---|---|
1 | 240 |
1.15 | 276 |
1.5 | 360 |
2 | 480 |
n | 240 * n |
new SpacingBetweenLines()
{
Line = "276", // 此值表示设置了1.15倍行距
LineRule = LineSpacingRuleValues.Auto
};
固定行距计算
new SpacingBetweenLines()
{
Line = "400", // 表示在固定值模式下设置了行距为20
LineRule = LineSpacingRuleValues.Exact
};
Word 中设置字号大小 n 磅,那么在代码层面的值是 2n 。比如在 Word 中字号设置为 14 磅,那么代码中的值取 14×2=28
new FontSize() { Val = "28" } // 表示字体大小设置为了14磅
首行缩进字符数
new Indentation()
{
FirstLineChars = 200 // 表示首行缩进两个字符
};
字号 | 磅 |
---|---|
初号 | 42 |
小初 | 36 |
一号 | 26 |
小一 | 24 |
二号 | 22 |
小二 | 18 |
三号 | 16 |
小三 | 15 |
四号 | 14 |
小四 | 12 |
五号 | 10.5 |
小五 | 9 |