Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/greyovo/md2word-pandoc

[已归档 / Archived] 一个markdown转word工具。使用C#编写、提供GUI界面设置样式(Winform)、依赖Pandoc。
https://github.com/greyovo/md2word-pandoc

docx markdown md md2word pandoc pandoc-gui winform word

Last synced: about 1 month ago
JSON representation

[已归档 / Archived] 一个markdown转word工具。使用C#编写、提供GUI界面设置样式(Winform)、依赖Pandoc。

Awesome Lists containing this project

README

        

# 敬请留意 / Attention

本项目已不再更新。请查看 [markdocx](https://github.com/greyovo/markdocx),一个跨平台,**不依赖pandoc**,更灵活地设置样式的 md 转 word 工具。

This repository is no longer updated. Please see [markdocx](https://github.com/greyovo/markdocx), a cross-platform, **pandoc-free** markdown to word tool with flexible style settings.

---

# MD2Word-Pandoc

![screenshoot](images/screenshoot.jpg)

一个使用 C#编写的、基于[Pandoc](https://github.com/jgm/pandoc)的 markdown 转换 word 工具。其本质是在 Pandoc 的基础上提供一个 GUI 界面,方便操作。初学 C#和 Winform 的作品,还在摸索阶段,有更好的思路或找到了 bug 可以留 issue,我都会看到并且回复的 :)

> 注意!本项目还在开发当中,并且要求系统安装 Pandoc。已基本实现转换和样式保存导出功能,GUI 界面还未完成,目前阶段的使用方法见 [使用方法](#使用方法)

## 自助转换

一般而言,我使用 [Typora](https://www.typora.io) 编写 Markdown,而 Typora 中自带有导出 HTML 格式的功能。如果对文档中的代码高亮没有要求,可以通过以下步骤进行转换为 Word 文件,效果也还不错。

1. Typora 中:文件 - 导出 - HTML(without Styles)。
> 一定要选 without style,这样导出的就是纯净的 HTML 文件
2. 打开 HTML 文件,全选,复制
3. 新建 Word 文档,粘贴(保留源样式)。到这就基本完成了,目录大纲级别也会被保留
4. 如果需要,可以修改样式,比如全选减小字号、更换字体、行距等等

## 为什么做这个

在接触了 markdown 之后,越发觉得 Word 调节样式非常繁琐了,但无奈平时的实验报告又不得不上交 Word 版本,转了一圈也没有找到一个好用的 markdown 转 word 工具。而 Pandoc 默认的 Word 样式在中文状态下不美观,于是萌生了编写此工具的想法。

## 本项目功能

### 基本

- [x] 由.md 文件转换为一个排版样式尚可的 Word 文档。转换出的 Word 的字符、段落样式符合中文的书写和显示习惯(如段首缩进、行间距、字体的选择等)
- [x] 段落样式可供设置的内容:字号、字体、段落间距、颜色、(加粗、斜体、下划线?)等
- [x] 提供可视化界面,样式可由用户方便地设置
- [x] 拖拽即可导入文件
- [ ] 软件自带有若干个样式预设
- [ ] 可以保存预设,可以导入、导出样式预设

### 更进一步

- [ ] 读取 md 文件的 yaml 信息来进行自动样式设置
- [ ] 提供论文排版模式,即在首页之前添加特定的封面、处理参考文献等
- [ ] 根据 MD 的大纲级别制作目录
- [ ] 制作一个精简版的 pandoc 依赖,只需要其中的 md 转换 docx 的功能,从而简化软件体积

## 使用方法

注意,要求系统已安装[Pandoc](https://github.com/jgm/pandoc)。测试所用的版本为 2.7.2,理论上更高版本也可行,但未测试。

> 测试阶段,未来应该会完善 :)

0. 前往[Release](https://github.com/greyovo/md2word-pandoc/releases)页面下载 zip 并解压,运行其中的 exe 文件
1. 拖入 `.md` 文件到窗口中
2. 下拉菜单选择预设,或修改样式
3. 执行转换
4. 转换出的 docx 文件将保存在与源 md 的同目录下

可对该 xml 文件进行修改,以满足自己的样式需求。

## 实现思路

> 有更好的思路、方法可以留 issue,我会看到的

1. 关键:根据用户的样式设置,生成一个可供 pandoc 转换时使用的临时`template.docx`——使用 Office Open XML SDK 操作

1. 创建一个新的临时的 docx
2. 根据 pandoc 参照模板,生成若干段落样式
3. 向临时的 docx 中添加这些段落样式
4. 保存并关闭这个 docx

2. 调用 pandoc。使用以下命令:

```shell
pandoc -o output.docx input.md --reference-doc=template.docx
```

解释:由源 md 文件`input.md`参照`template.docx`中的样式列表生成 Word 文档`output.docx`。

3. 使用 JSON 或 XML 保存样式预设,用于导入和导出分享、保存样式信息

### 核心步骤

```csharp
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 User's Guide

Pandoc 转换时参考的样式,要求 StyleName 和 StyleId 两个属性共同满足其给出的模板中对应的样式名称和 ID

[完整的 Pandoc User's Guide](https://pandoc.org/MANUAL.html#pandocs-markdown)

### 段落样式

| 样式名 | 描述 | 必须 |
| --------------- | ----------------------------------------------------------------------- | ---- |
| 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

- 下载:

- 在 VS 中引入:

- 可选:OpenXMLSDKTool,用于查看 Word 文档中的各项内容

![OpenXml SDK Tool](images/openxml_tools.png)

### Microsoft 官方文档

[主要] Office Open XML SDK 字处理 概述

[https://docs.microsoft.com/zh-cn/office/open-xml/word-processing?view=openxml-2.8.1](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 |

```csharp
new SpacingBetweenLines()
{
Line = "276", // 此值表示设置了1.15倍行距
LineRule = LineSpacingRuleValues.Auto
};
```

固定行距计算

$$
固定行距的设置值 = 磅值×20
$$

```csharp
new SpacingBetweenLines()
{
Line = "400", // 表示在固定值模式下设置了行距为20
LineRule = LineSpacingRuleValues.Exact
};
```

##### 字体大小

Word 中设置字号大小 n 磅,那么在代码层面的值是 2n 。比如在 Word 中字号设置为 14 磅,那么代码中的值取 14×2=28

```csharp
new FontSize() { Val = "28" } // 表示字体大小设置为了14磅
```

##### 缩进

首行缩进字符数

$$
FirstLineChars = 字符数×10
$$

```csharp
new Indentation()
{
FirstLineChars = 200 // 表示首行缩进两个字符
};
```

| 字号 | 磅 |
| ---- | ---- |
| 初号 | 42 |
| 小初 | 36 |
| 一号 | 26 |
| 小一 | 24 |
| 二号 | 22 |
| 小二 | 18 |
| 三号 | 16 |
| 小三 | 15 |
| 四号 | 14 |
| 小四 | 12 |
| 五号 | 10.5 |
| 小五 | 9 |