Giter Club home page Giter Club logo

md2word-pandoc's Introduction

敬请留意 / 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

md2word-pandoc's People

Contributors

greyovo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

md2word-pandoc's Issues

关于图片缩放之后没有移动到word文件中

大佬你好,我使用的md编辑器Typora,遇到的主要问题是markdown中的图片缩放之后就无法显示在Word文件中了,具体效果如下图所示:
image
转换出来的word文件:
image
可以发现缩放后的文件无法被复制到word中,在typora中缩放后的图片的显示方式是这样的:

<img src="courseTmp.assets/image-20210917115807450.png" alt="image-20210917115807450" style="zoom: 50%;" />

非常希望提供一下这个问题的解决方案

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.