几乎所有现有的md到PDF都通过LaTeX进行处理:kramdown,pandoc,multimarkdown等。

是否存在任何语言都没有的选项,例如使用诸如Prawn,libharu或jsPDF之类的后端?

到目前为止,我仅发现:



asciidoctor-pdf这种基于Prawn的asciidoc转换器非常活跃,并且有很多星星。

与Pandoc一起降价到Asciidoc,这是迄今为止我所见过的最好的选择。特别是要达到专业生产的水平:


代码和图像之类的浮点都不...浮点,因此当浮点较大时,您会在换行符上获得垂直空白:https://github.com/asciidoctor/asciidoctor-pdf/issues/353

有些行的单词太少,但水平对齐仍然存在,导致单词之间的空白过多。 TODO查找/创建票证。


Gimli,但它似乎不太活跃(最近一次提交是在7个月前)。后端?
markdown_prawn。星星不多。最后提交3年前。
Kramdown Prawn实验转换器。实验性的。
cmarkpdf:@jgm通过libharu将CommonMark转换为PDF。实验性的。
Qt5 QPrinter。由Retext编辑器通过PyQt5 Python API使用。 TODO测试。可能类似于类似于PhantomJS的解决方案,但适用于Qt而不是浏览器。

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

非自由可能性:


O'Reilly Atlas正在为其HTMLBook(HTML5子集)做到这一点,但他们很快就不会开源。
Prince XML。免费用于非商业用途。

相关:仅限Ruby这样的问题。

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

部分解决方案:


Sphinx允许RST通过https://code.google.com/p/rst2pdf/使用https://bitbucket.org/rptlab进行PDF转换/ reportlab在后端。


评论

您是否关心什么OS / Web应用程序?价格也一样吗?

@NickWilde越自由越好,越交叉越好。 Linux的支持会让我高兴。但我想听听所有选项=)

哦,忘了问您想要哪种界面-CLI或GUI。如果使用CLI,我可以确定不使用LaTex。

@NickWilde我更喜欢CLI,但是再次,我想了解所有这些。

比较喜欢CLI,那就好了:D ...答案马上就来了。

#1 楼

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


安装Node.js(如有必要)
安装Markdown-PDF-从cmdline运行npm install -g markdown-pdf

运行markdown-pdf -o readme.pdf readme.md(或所需的任何源和目标以及其他选项;有关您可以指定的所有详细信息,请参阅CLI选项。)

它是开放源代码(已获得MIT许可),并且具有Github存储库,它是免费的,而且据我所知它相当快。

从https://域中获取图像可能会有一个小问题,但是我还没有研究那里的内容-我的图像之一没有被加载,所以这很可能只是一些有趣的事情在我的md中,但有一点机会就是一个错误。

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

评论


后端:先使用Marked,再使用PhantomJS转换为HTML。 @NickWilde:您的链接是否可以在PDF中保留?我只得到图像。不确定PhantomJS是否可以实现。

– Ciro Santilli郝海东冠状病六四事件法轮功
2014年4月25日19:48在

嗯...我没有任何类型链接-只是[name](link)或[name] [id]类型链接,它们可以工作。他们俩在链接后都有链接文本,虽然看起来不太漂亮,但可能需要稍作调整即可解决-我忘了提了。

–尼克·迪金森·威尔德
2014年4月25日在19:59

您可以单击一次链接,然后在浏览器中打开它吗?您正在使用哪个PDF查看器?对于Evince和Okular,我只会得到纯样式的文本。我已经对[]()进行了测试,并且该文本也显示在右侧,这是一个不错的设计,因为它们的链接不可单击(对我来说)。

– Ciro Santilli郝海东冠状病六四事件法轮功
2014年4月25日在20:08

我在Windows(7)/ Adob​​e Acrobat(XI)上-标题不可单击,链接文本为(在首选浏览器中一键打开(在Adobe关于打开链接的安全警告之后)。对我来说,那是次要的,但是我可以看到对于某些用例来说这可能是一个重大问题。

–尼克·迪金森·威尔德
2014年4月25日在20:13



我等一下能不能解决

–尼克·迪金森·威尔德
2014年4月25日在20:17

#2 楼

我个人是pandoc的忠实拥护者。

Pandoc是格式转换的“瑞士军”刀工具: Markdown(包括任何主要的MD“方言”,例如GitHub和PHP的风格以及一些特殊的扩展)。其他输入格式是:HTMLrSTTextileDocBook XMLMediaWiki
作为输出格式,它支持:ConTeXtLaTeXPDFBeamer PDF(尽管在后台需要LaTeX),MediaWikiDOCXDocBookrSTTextileASCIIDoctexinfo,q43120g79-mode(Emac) HTML幻灯片),org(HTML幻灯片),S5(HTML幻灯片),Slidy(HTML幻灯片),Slideous(HTML幻灯片),ImpressJSDZSlidesHTMLHTML5
...以及:EPUB(GROFF手册页)和EPUB3(OpenDocument文本)。

您还和我在一起吗?好。

您是否注意到最后两个manpageODT吗?

好,这些是我个人为了中间格式而“滥用”的两种输出格式在不希望使用LaTeX的情况下,可以在PDF中获取最终文档。

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




对于我的pandoc目标,它以无头模式运行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 - ; )
对于我的pdflatex目标,它使用.odtpdf从Pandoc的联机帮助页输出文件中创建PostScript,然后使用Ghostscript创建PDF。因此它可以运行:

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



自定义ODT输出的外观

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



...因为Pandoc知道如何将一些漂亮的个性化样式应用于目标ODT(如果只有这些)在.manpdf中正确定义了样式! (这些样式当然也会转移到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)/$@ \
            $<


man -t参数告诉Pandoc接受我想在我的MD源文件中使用的几个Markdown语法扩展。

在ODT文档中获取样式的最甜蜜的秘密在于myreference.odt命令行参数。

即使您的Markdown输入是正确编写的,ODT输出也可以使用参考和参考书目!


使用Windows?工作流也应该在Windows上工作,因为Pandoc也可以在Windows上运行。我以前曾在Windows上运行过Pandoc,但是我自己还没有设置一个完全自动化的工作流程,但是首先基于此处的Makefile首先创建“ --from=markdown+...+...+:Markdown-> ODT”,然后创建“ --reference-odt=/path/to/myreference.odt:ODT-> PDF” ...

,但是您可能想探索Windows上的另一条路径:


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

是的,您还可以使用Pandoc开关自定义DOCX输出文件的样式。只需首先创建一个.\soffice文件即可,它完全使用您想要的样式。 Pandoc然后将从参考doc中提取这些文件,并将其应用于它生成的输出DOCX!

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

最后:确保使用最新最好的Pandoc版本(当前为v1.17.0.3或以后)-尤其是最近几个月增加了许多功能。谈到DOCX输出!

评论


我的markdown文件包含一个unicode字符和pandoc块。我该如何解决?

–chmike
2015年10月7日在8:38

将--latex-engine = xelatex或--latex-engine = lualatex添加到您的Pandoc命令中。 (默认)引擎pdflatex无法处理Unicode。

– Kurt Pfeifle
2015年10月7日在8:49

#3 楼

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


实际上可以建立正确的链接。
实际上运行起来稍快一些缺点:

不是“漂亮”的-除了链接外,Markdown-PDF看上去一切都更好。尽管可以在生成PDF之前在HTML中添加一些CSS来轻松解决*。
安装更加复杂。



这也是基于Node.js的解决方案使用Marked和wkhtmltopdf节点软件包。
安装:

安装Nodejs。
安装Marked-最简单的方法是通过命令行:npm -g install marked

安装wkhtmltopdf NPM-通过命令行最简单:npm -g install wkhtmltopdf

安装wkhtmltopdf主文件-没有可用的安装程序。
将wkhtmltopdf bin目录添加到PATH

用法:
使用需要两个CLI调用。当然,您也可以将其保存为批处理文件并运行。包装器以添加一些CSS(可以选择添加合理的默认值或用户定义的选项)。包装程序还将使其一次调用而不是两次运行,并且可能使其一次调用npm install cmd而不是手动安装。如果/当我这样做时,我会在这里分享。

评论


以下内容基于wkhtmltopdf:github.com/pdfkit/pdfkit。还没有尝试过,但是我还不了解wkhtmltopdf不能做什么。

– Ciro Santilli郝海东冠状病六四事件法轮功
2014年4月26日6:00

看起来这是wkhtmltopdf的红宝石包装

–尼克·迪金森·威尔德
14年4月26日在6:04

我还没有尝试过,所以我无法审查它的工作情况,但是在可安装性方面却做得不是很好:回购是1Gb,包括一个0.5 Gb Qt分支!

– Ciro Santilli郝海东冠状病六四事件法轮功
2014年4月27日6:10



呃,我猜这一定是PDFKit而不是我的建议-因为我的建议的总下载大小远低于30mb-〜6mb Nodejs,〜16mb wkhtmltopdf,然后包装器相对较小(node-wkhtmltopdf为2.8kb )。

–尼克·迪金森·威尔德
2014年4月27日在6:40

啊,我当时在谈论wkhtmltopdf信息库,但也许其中包括许多未安装的东西。谢谢。

– Ciro Santilli郝海东冠状病六四事件法轮功
2014-4-27 7:00



#4 楼

要以@ nick-wilde的解决方案为基础,如果您使用grunt,那么有标记和wkhtmltopdf的插件:


grunt-marked
grunt-wkhtmltopdf

安装完主要的wkhtmltopdf二进制文件之后,您可以使用npm安装插件: />
npm install grunt-marked --save-dev
npm install grunt-wkhtmltopdf --save-dev


然后在您的构建中,只需连续调用两个即可:

marked: {
  std : {
    files: {
      'out.html' : ['src.md']
    }
  }
},

wkhtmltopdf: {
  std : {
    src: 'out.html',
    dest: 'out.pdf'
  }
},


如果您希望它看起来很漂亮,您可以我将不得不花更多时间使用Gruntfile.js设置,但我确定它是可行的。

#5 楼

它不是性感的,但是AbiWord会将HTML转换为PDF。

因此,假设您已安装了abiword:

markdown some.md > some.html  
abiword -t pdf -o some.pdf some.html


评论


谢谢你的提示。也许有人可以告诉我们他们使用哪种类型的后端:通用或重复使用第三方工具。

– Ciro Santilli郝海东冠状病六四事件法轮功
2015年11月22日0:00

#6 楼

我最近创建了一项将降价文档转换为PDF的服务。它支持GitHub风格的markdown以及语法突出显示。该服务位于:http://markdown2pdf.com

评论


它是开源的吗?底层技术是什么?

– Ciro Santilli郝海东冠状病六四事件法轮功
15年8月27日在5:57

#7 楼

我只是从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);
$s_in = file_get_contents('index.html');
$dompdf->loadHtml($s_in);

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


此解决方案仅需要PHP(25 MB)和DomPdf(4 MB),因此轻巧
与其他选项相比。