Markdown 转换成 docx,包括复杂模板。

79

我已经使用Pandoc自动化了我的构建过程,将Markdown文件转换为DOCX文件。我甚至使用了一个参考文档来设置最终文档的样式。我使用的命令是:

pandoc -f markdown -t docx --data-dir=docs/rendering/ mydoc.md -o mydoc.docx

Pandoc会从docs/rendering中获取reference.docx,然后使用相同的样式来渲染mydoc.docx。不过,reference.docx并不仅包含样式。它还包含公司标志、前言等内容。
我该如何自动合并Markdown内容和reference.docx的样式和内容呢?我的解决方案需要在Linux上运行。

你可以尝试使用 MergeDocx(我们的商业产品;Java)。 - JasonPlutext
我曾尝试过类似的事情,但我发现最简单的方法是使用特殊的打印样式呈现网页,然后让 Chrome 将其制作成 PDF。或者将页面打印到 PDF 打印机上。我不得不重新创建整个 DOCX,但这似乎比合并整个格式更容易(而且也能避免错误)。 - ayke
4个回答

36

Update

Use the piped version suggested by user Christian Long:

pandoc -t latex mydoc.md | pandoc -f latex --data-dir=docs/rendering/ -o mydoc.docx

我知道这篇文章可能有些晚了,但我想假设在三年之后人们仍然在寻找解决方案——就像我当时一样。

我的解决方案是使用LaTeX作为Markdown和docx之间的中介(实际上我是从org-mode转换过来的,但基本上是一样的)。所以在你的情况下,我相信一个一行代码的解决方案应该是:

pandoc -f markdown -t latex -o mydoc.tex mydoc.md && \
pandoc -f latex -t docx --data-dir=docs/rendering/ -o mydoc.docx mydoc.tex

这可能会让你更接近目标。当然,Pandoc 可以处理约一百个参数,并且可能有更美观的方法。自您首次发布问题以来,它也经历了不少更新。


2
这个解决方案可行。为了简化一些步骤,你可以跳过中间的 .tex 文件,直接将 LaTeX 格式的数据从一个 pandoc 管道传输到另一个。pandoc -t latex mydoc.md | pandoc -f latex --data-dir=docs/rendering/ -o mydoc.docx - Christian Long

14

理想情况下,您可以使用自定义的docx模板,但pandoc目前尚不支持该功能。 reference.docx文件仅允许将自定义样式嵌入到新创建的docx文件中。

幸运的是,您可以使用odt来近似实现此目标,而不是使用docx。 您可以相当容易地修改默认的OpenDocument模板,以包括您的自定义徽标、导言和其他内容。 使用自定义模板配合reference.odt文件即可获取所有样式和自定义内容。

一旦您有了odt格式的文件,就可以使用任何数量的命令行工具将其从odt转换为docx。例如,在Linux上,您可以运行以下命令:

libreoffice --invisible --convert-to docx test.odt

或者在OS X上:

/Applications/LibreOffice.app/Contents/MacOS/soffice.bin --invisible --convert-to docx test.odt

1
为什么不自动将docx文件/模板转换为odt?然后在pandoc转换中使用odt?(我是pandoc和文档模板的新手,请原谅我的无知问题。) - Johnny Utahh
2
Pandoc需要在odt模板中添加特殊变量才能正常工作(例如,请参见https://github.com/andrewheiss/Global-Pandoc-files/blob/master/templates/odt.template#L34)。您无法在本机docx中创建这些变量-它们必须通过文本编辑器手动添加。 - Andrew

11
理想情况下,PanDoc将会增加这个功能但看起来不太可能
我不知道有什么直接完成这项工作的工具,但是您可以在代码中使用reference.docx和您通过PanDoc生成的mydoc.docx进行回退合并。
.Docx格式是(mostly) XML文件的ZIP归档文件。 最重要的是word/document.xml。 如果您使用XML工具从一个文件中提取(most of)document.xml并将其插入到另一个文件中,则会得到更接近您所需的内容。
如果需要,我可以用Ruby编写一个示例。

9

更新:此功能未完成

我在一些复杂的模板上使用了它,并且发现它很好地映射了字体、公司标志等。但是,在 .docx -> .docx 的转换中,我必须手动应用标题样式到章节/分区断点。字体是正确的,但部分划分不正确。我接下来将尝试 .md -> .docx。


此功能现在在 Pandoc 中可用,如下所述:

Markdown to docx, including complex template

来自上面链接:

pandoc  input --reference-docx=my-reference.docx -o out.docx

这里,my-reference.docx(注意:不是 .dotx)可以位于以下位置之一:

  • 当前文件夹
  • 由 --data-dir 定义的文件夹
  • 系统默认的 data-dir 文件夹,其中:
    • 在类 UNIX 系统上是 $HOME/.pandoc
    • 在 Windows XP 上是 C:\Documents And Settings\USERNAME\Application Data\pandoc(你应该不再使用此操作系统)
    • 在 Windows Vista 或更高版本上是 C:\Users\USERNAME\AppData\Roaming\pandoc。

这行代码似乎不完整,无法回答上面的问题。 - AdamO
1
标签已更改为 --reference-doc=my-reference.docx - MyICQ
1
标签已更改为 --reference-doc=my-reference.docx - MyICQ
我假设 input 意味着 from-file.md;在 Pandoc 用户指南 中,我没有看到任何关于在命令行中使用 input 的提及。 - Todd Partridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接