[分享] org 文件转 docx 格式

之前一直用 org-export-docx 这个自定义函数通过 Pandoc 转 org 文件到 docx,最近发现如果文件路径名带空格就法转换。经过查询,只要在命令参数中的路径用 \" 包裹起来就可以正常使用了。

其实这有一个现成的 Emacs 包 ox-pandoc,但我个人需求比较简单,就没去用它,感兴趣的可以试试。

这里总结了一篇文章,介绍两种将 org 文件转 docx 格式的方式。

对于这个问题,用 call-process 替换 shell-command 来解决会更好。写了个更加强壮的版本,更方便看到出错信息。如有写的不对的地方,欢迎指正。

(defun org-pandoc-convert-to-docx ()
    "Convert current buffer file to docx format by Pandoc."
    (interactive)
    (let ((command "pandoc")
          (refdoc (list "--reference-doc"
                        (expand-file-name "var/reference.docx" user-emacs-directory))))
      (cond ((not buffer-file-name) (user-error "Must be visiting a file"))
            (t (let* ((buffer (generate-new-buffer " *Pandoc output*"))
                      (filename (list buffer-file-name))
                      (output (list "-o" (concat (file-name-sans-extension (buffer-file-name)) ".docx")))
                      (arguments (nconc filename refdoc output))
                      (exit-code (apply #'call-process command nil buffer nil arguments)))
                 (cond ((eql 0 exit-code)
                        (kill-buffer buffer)
                        (message "Convert finished: %s" (cadr output)))
                       (t (with-current-buffer buffer
                            (goto-char (point-min))
                            (insert (format "%s\n%s\n\n" (make-string 50 ?=) (current-time-string)))
                            (insert (format "Calling pandoc with:\n\n%s\n\nFailed with error:\n\n"
                                            (mapconcat #'identity (cons command arguments) " ")))
                            (special-mode))
                          (pop-to-buffer buffer)
                          (error "Convert failed with exit code %s" exit-code))))))))

PS:这个函数其实也可以用在 Markdown 等其他格式转 docx,看来名字要改下了。这也是用 pandoc 的优势。

1 个赞