如何在没有 LaTeX 的情况下将 Markdown 转换为 PDF?

软件推荐 linux pdf 降价
2021-10-17 21:37:17

几乎所有现有的 md 到 PDF 都经过 LaTeX:kramdown、pandoc、multimarkdown 等。

是否有任何语言没有的选项,例如使用PrawnlibharujsPDF等后端?

到目前为止,我只发现:

  • asciidoctor-pdf这个基于虾的 asciidoc 转换器非常活跃并且有很多星星。

    使用 Pandoc 将降价到 Asciidoc,然后这是我迄今为止看到的最佳选择。

    然而,在专业生产准备方面,它并不完美,特别是:

    • 像代码和图像这样的浮动不会...浮动,因此当您有大浮动时,您会在换行符处获得垂直空格:https ://github.com/asciidoctor/asciidoctor-pdf/issues/353
    • 有些行的单词太少,但它们仍然是水平对齐的,这导致单词之间的空白过多。TODO 查找/创建工单。
  • Gimli,但它似乎不是很活跃(最后一次提交是 7 个月前)。后端?

  • 降价对虾明星不多。最后一次提交是 3 年前。

  • Kramdown Prawn 实验转换器实验性的。

  • cmarkpdf:@jgm 通过 libharu 将 CommonMark 转换为 PDF。实验性的。

  • Qt5 QPrinterRetext 编辑器通过PyQt5 Python API 使用待办事项测试。可能类似于类似 PhantomJS 的解决方案,但用于 Qt 而不是浏览器。

如果您可以很好地将 Markdown 生成的 HTML 子集转换为 PDF,那么这是一个解决方案,但我还没有找到可以正确执行此操作的免费软件。例如,PhantomJS 转换会破坏 markdown 链接<http://a.com>,这些链接在 PDF 上显示为简单样式的文本,而不是在首选浏览器上打开的可点击链接,这些链接是通过 LaTeX 转换生成的。

非免费的可能性:

相关:Ruby only SO question

为什么我想要这个:LaTeX 很慢,会产生可怕的错误消息,很难安装,而且对于 Markdown 所需的小子集来说过于复杂。

部分解决方案:

4个回答

Node.js 包Markdown-PDF应该可以正常工作。我一直在使用Grunt 包,但为了得到一个好的答案,我只是通过命令行快速运行了原始包;是的,它工作得很好。

所以要使用Markdown-PDF的 CLI :

  1. 安装Node.js(如有必要)
  2. 安装Markdown-PDF - 从 cmdline 运行npm install -g markdown-pdf
  3. 运行markdown-pdf -o readme.pdf readme.md(或您想要的任何源和目标以及其他选项;有关您可以指定的所有详细信息,请参阅CLI 选项)。

它是开源的(MIT 许可),并且有一个Github 存储库,它是免费的,据我所知,它的速度非常快。

从 https:// 域获取图像可能会有一点问题,但我还没有调查那里有什么 - 我的一张图像没有被加载,所以这很可能只是我的 md 中的一些有趣的东西,但有一点机会是一个错误。

一个重大错误:未创建可点击链接。

我个人是pandoc.

Pandoc 是格式转换的“瑞士军”刀工具:

  • 它支持的核心源输入格式Markdown(包括任何主要的 MD “方言”,例如 GitHub 和 PHP 的风格以及几个特殊扩展)。其他输入格式有:HTML, rST, Textile, DocBook XML, MediaWiki.
  • 作为输出格式它支持:ConTeXt、、(尽管需要在后台使用 LaTeX、、、、、、、、、、(Emacs 组织模式)、HTML幻灯片)、HTML 幻灯片)、HTML 幻灯片)、(HTML 幻灯片), (HTML 幻灯片), , , , ...and: (GROFF manpage) 和(OpenDocument Text)。LaTeXPDFBeamer PDFMediaWikiDOCXDocBookrSTTextileASCIIDoctexinfoorgS5SlidySlideousImpressJSDZSlidesHTMLHTML5EPUBEPUB3
    manpageODT

你还在听我说吗?好的。

你注意到最后两个manpageODT

好吧,这是我个人“滥用”作为中间格式的两种输出格式,以便在我不想涉及 LaTeX 时为最终文档生成 PDF。

在Makefile的帮助下,我已经自动化了我的工作流程和流程链所以我只需要输入make mydoc.latexpdf, or make mydoc.odtpdf, or make mydoc.manpdfMakefile 设置为查找 的输入mydoc.mmd,然后设置适当的命令运行:pandoc直接创建 PDF(在后台首先转换为 LaTeX,然后pdflatex自行运行)、ODT 或联机帮助页。然后下一个命令是创建最终格式:

  • 对于我的.odtpdf目标,它以无头模式运行LibreOffice以下是我使用的基本命令行(我在 OS X 上,因此对于 Linux 或 Windows,您必须相应地调整路径)。注意,命令是 Makefile 语法——未经事先改编不能直接在 Shell 中使用:

    (cd /Applications/LibreOffice.app/Contents/MacOS; \
    ./soffice "-env:UserInstallation=file:///tmp/LibO_Conversion__$(USER)" \
            --headless \
            --convert-to pdf:writer_pdf_Export \
            --outdir $(CURRDIR)/$(FINAL)  $(CURRDIR)/$(BUILD)/$(subst .odtpdf,.odt,$@) ; \
    cd - ; )
    
  • 对于我的.manpdf目标,它用于man -t从 Pandoc 的联机帮助页输出文件创建 PostScript,然后使用 Ghostscript 创建 PDF。因此它运行:

    man -t <pandoc's manpage output file> \
     | gs -o ${HOME}/<pandoc-sourcedoc-name>.pdf -sDEVICE=pdfwrite -
    

自定义ODT 输出的外观

通过 ODT 到 PDF 的非 LaTeX 路径对我来说是最“性感”的......

  • ...因为 Pandoc 知道如何将一些不错的个性化样式应用到目标 ODT,只要这些样式在myreference.odt! (这些样式当然也会转移到 PDF 中。)

然后我可以运行 Pandoc 命令(通过 Makefile 或在 Shell 中)根据我的喜好创建一个 ODT,包括我喜欢的字体、大小和颜色,以及我定义的页面大小和页眉、页脚或背景(再次: Makefile 语法!):

     pandoc \
            --toc \
            --toc-depth=4 \
            --to=odt \
            --chapters \
            --filter=pandoc-citeproc \
            --standalone \
            --reference-odt=$(RESOURCES)/myreference.odt \
            --from=markdown+mmd_title_block+pipe_tables+grid_tables+tex_math_dollars+raw_tex+footnotes+inline_notes+citations+link_attributes \
            --bibliography=$(RESOURCES)/my.bib \
            --csl=$(RESOURCES)/kp.csl \
            --number-sections \
            --output=./$(BUILD)/$@ \
            $<

--from=markdown+...+...+参数告诉 Pandoc 接受几个我喜欢在我的 MD 源文件中使用的Markdown 语法扩展。

在 ODT 文档中获取样式的秘密在于--reference-odt=/path/to/myreference.odt命令行参数。

ODT 输出甚至可以与参考文献和参考书目一起使用(如果您的 Markdown 输入为此正确编写)


使用视窗?

原则上,这个工作流程也应该在 Windows 上运行,因为 Pandoc 也可以在 Windows 上运行。我之前在 Windows 上运行过 Pandoc,但我自己并没有设置一个完全自动化的工作流程,首先是PandocMarkdown -> ODT,然后是.\sofficeODT-> PDF,这里基于 Makefile,虽然...

但您可能想在 Windows 上探索另一条路径

  • 首先从 Pandoc 创建 DOCX 输出;
  • 然后将 DOCX 转换为 PDF(自动或通过 WinWord 交互)。

是的,您还可以使用--reference-docx=my-reference.docx开关自定义 DOCX 输出文件的样式。只需首先创建一个my-reference.docx文件,它使用您想要的样式。Pandoc 然后将从参考文档中提取这些并将它们应用于它生成的输出 DOCX!

从那里,您可以了解如何将中间 DOCX 文件转换为 PDF。这也可以自动完成:您可能还需要考虑OfficeToPDF.exe它托管在 CodePlex 上,获得 Apache 2.0 许可,并以二进制和源代码形式提供。

最后:一定要使用最新最好的 Pandoc 版本(目前是 v1.17.0.3 或更高版本)——最近几个月添加了很多功能,尤其是。当谈到 DOCX 输出时!

我研究了另一种选择。Markdown-PDF相比:

  • 优点:
    • 实际上建立了适当的链接。
    • 实际上跑得快一点
  • 缺点:
    • 不像“漂亮” - 除了链接之外,Markdown-PDF 的一切看起来都更好。不过,这可以通过在生成 PDF 之前向 HTML 添加一些 CSS 来轻松解决*。
    • 安装比较复杂。

这也是一个基于Nodejs的解决方案,它使用Markedwkhtmltopdf节点包。

安装:

  • 安装Node.js。 _
  • 安装标记- 通过命令行最简单:npm -g install marked
  • 安装wkhtmltopdf NPM - 通过命令行最简单:npm -g install wkhtmltopdf
  • 安装wkhtmltopdf 主文件- 没有可用的安装程序。
  • 将 wkhtmltopdf bin 目录添加到 PATH

用法:

使用需要两个 CLI 调用。您当然可以将其保存为批处理文件并运行它。

marked input.md -o output.html
wkhtmltopdf input.html output.pdf

* 由于链接有效,我可能会切换到此方法而不是Markdown-PDF,在这种情况下,我可能会编写一个包装器来添加一些 CSS(带有添加合理默认值或用户定义的选项)。包装器还将使其一次调用而不是两次运行,并且可能使其成为一次 npm install cmd 而不是手动安装。如果/当我这样做时,我会在这里分享。

我只是从 HTML 转换而来。这适用于我的需求:

https://github.com/dompdf/dompdf

我发现通常 Markdown 不是转换为 PDF 的好格式,因为它没有原生 CSS 支持。这是我使用的脚本:

<?php
require 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;

$dompdf = new Dompdf();
$dompdf->getOptions()->setIsFontSubsettingEnabled(true);
$get = file_get_contents('index.html');
$dompdf->loadHtml($get);

$dompdf->render();
$put = $dompdf->output();
file_put_contents('index.pdf', $put);

这个解决方案只需要 PHP (25 MB) 和 DomPdf (4 MB),与其他选项相比非常轻量级。