Skip to content

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

Notifications You must be signed in to change notification settings

greyovo/md2word-pandoc

Repository files navigation

敬请留意 / Attention

本项目已不再更新。请查看 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.


MD2Word-Pandoc

screenshoot

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

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

自助转换

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

  1. Typora 中:文件 - 导出 - HTML(without Styles)。

    一定要选 without style,这样导出的就是纯净的 HTML 文件

  2. 打开 HTML 文件,全选,复制
  3. 新建 Word 文档,粘贴(保留源样式)。到这就基本完成了,目录大纲级别也会被保留
  4. 如果需要,可以修改样式,比如全选减小字号、更换字体、行距等等

为什么做这个

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

本项目功能

基本

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

更进一步

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

使用方法

注意,要求系统已安装Pandoc。测试所用的版本为 2.7.2,理论上更高版本也可行,但未测试。

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

  1. 前往Release页面下载 zip 并解压,运行其中的 exe 文件
  2. 拖入 .md 文件到窗口中
  3. 下拉菜单选择预设,或修改样式
  4. 执行转换
  5. 转换出的 docx 文件将保存在与源 md 的同目录下

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

实现思路

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

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

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

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

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

  3. 使用 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 User's Guide

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

完整的 Pandoc User's Guide

段落样式

样式名 描述 必须
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:待补充

所需依赖

OpenXml SDK Tool

Microsoft 官方文档

[主要] 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
};

固定行距计算

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

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

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

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

首行缩进字符数

$$ FirstLineChars = 字符数×10 $$

new Indentation()
{
    FirstLineChars = 200 // 表示首行缩进两个字符
};
字号
初号 42
小初 36
一号 26
小一 24
二号 22
小二 18
三号 16
小三 15
四号 14
小四 12
五号 10.5
小五 9

About

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

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages