Fast jedes vorhandene md to PDF geht durch LaTeX: Kramdown, Pandoc, Multimarkdown usw.
Gibt es Optionen, die dies in keiner Sprache tun, z. B. mit einem Backend wie Prawn , libharu oder jsPDF ?
Bisher habe ich nur gefunden:
asciidoctor-pdf Dieser auf Garnelen basierende Asciidoc-Konverter ist ziemlich aktiv und hat viele Sterne.
Markdown zu Asciidoc mit Pandoc und dann ist dies die beste Option, die ich bisher gesehen habe.
Es ist jedoch nicht so perfekt, dass es für die professionelle Produktion bereit ist, insbesondere:
Gimli , aber es scheint nicht sehr aktiv zu sein (letztes Commit vor 7 Monaten). Backend?
markdown_prawn . Nicht viele Sterne. Letzte Zusage vor 3 Jahren.
Kramdown Prawn experimenteller Konverter . Experimental.
cmarkpdf : CommonMark zu PDF über libharu von @jgm. Experimental.
Qt5 QDrucker . Wird vom Retext-Editor über die PyQt5-Python-API verwendet . TODO-Test. Wahrscheinlich analog zu einer PhantomJS-ähnlichen Lösung, aber für Qt anstelle des Browsers.
Wenn Sie die von Markdown generierte HTML-Teilmenge gut in PDF konvertieren können, ist dies eine Lösung, aber ich muss noch eine kostenlose Software finden, die dies richtig macht. Zum Beispiel unterbrechen PhantomJS-Konvertierungen Markdown-Links <http://a.com>
, die als einfacher formatierter Text in der PDF-Datei angezeigt werden, und nicht als anklickbare Links, die im bevorzugten Browser geöffnet werden und durch LaTeX-Konvertierungen generiert werden.
Unfreie Möglichkeiten:
O'Reilly Atlas macht es für ihr HTMLBook (HTML5-Teilmenge), aber sie werden das in absehbarer Zeit nicht als Open Source veröffentlichen .
Prinz XML . Kostenlos für nicht-kommerzielle Nutzung.
Verwandte: Nur Ruby SO Frage .
Warum ich das möchte: LaTeX ist langsam, erzeugt schreckliche Fehlermeldungen, ist schwer zu installieren und zu komplex für die kleine Teilmenge, die für Markdown benötigt wird.
Teillösungen:
Das Node.js-Paket Markdown-PDF sollte gut funktionieren. Ich habe das Grunt-Paket davon verwendet , aber nur um eine gute Antwort zu erhalten, habe ich das Original schnell über die Befehlszeile ausgeführt ; und ja es funktioniert super.
Um also einfach die CLI von Markdown-PDF zu verwenden:
npm install -g markdown-pdf
markdown-pdf -o readme.pdf readme.md
(oder beliebige Quelle und Ziel und andere Optionen, die Sie möchten; siehe CLI-Optionen für alle Details darüber, was Sie angeben können).Es ist Open-Source (MIT-lizenziert) und hat ein Github-Repo , es ist kostenlos und soweit ich es gefunden habe, ist es ziemlich schnell.
Es kann ein kleines Problem beim Abrufen von Bildern von https://-Domains geben, aber ich habe nicht untersucht, was dort oben ist - eines meiner Bilder wird nicht geladen, also ist dies höchstwahrscheinlich nur etwas Lustiges in meinem MD, aber es gibt ein kleines Problem Chance, dass das ein Bug ist.
Ein wesentlicher Fehler: Anklickbare Links werden nicht erstellt.
<http://a.com>
Links im PDF? Ich bekomme nur Bilder. Ich bin mir nicht sicher, ob dies mit PhantomJS möglich ist.[]()
, der Text erscheint rechts, was ein gutes Design ist, da die Links nicht anklickbar sind (für mich).Ich persönlich bin ein großer Fan von pandoc
.
Pandoc ist das "Schweizer-Armee"-Werkzeug für Formatkonvertierungen:
Markdown
Andere Eingabeformate sind: HTML
, rST
, Textile
, DocBook XML
, MediaWiki
.ConTeXt
, LaTeX
, PDF
und Beamer PDF
(obwohl LaTeX im Hintergrund erforderlich ist), MediaWiki
, DOCX
, DocBook
, rST
, Textile
, ASCIIDoc
, texinfo
, org
(Emacs Org-Modus), S5
(HTML-Folien), Slidy
(HTML-Folien), Slideous
(HTML-Folien), ImpressJS
(HTML-Folien ), DZSlides
(HTML-Folien), HTML
, HTML5
, EPUB
, EPUB3
manpage
(GROFF-Manpage) und ODT
(OpenDocument-Text).Sind Sie noch da? Gut.
Hast du die letzten beiden bemerkt, manpage
und ODT
?
Nun, das sind die beiden Ausgabeformate, die ich persönlich als Zwischenformate "missbrauche", um zu PDF für endgültige Dokumente zu gelangen, wenn ich kein LaTeX im Spiel haben möchte.
Ich habe meinen Workflow und meine Prozesskette mit Hilfe eines Makefiles automatisiert . Also muss ich nur make mydoc.latexpdf
, oder make mydoc.odtpdf
, oder eingeben make mydoc.manpdf
. Das Makefile ist so eingerichtet, dass es nach einer Eingabe von sucht mydoc.mmd
und dann die entsprechenden Befehle in Gang setzt: pandoc
um das PDF direkt zu erstellen (das im Hintergrund zuerst nach LaTeX konvertiert und dann pdflatex
selbst ausgeführt wird), ODT oder Manpage. Dann ist der nächste Befehl, das endgültige Format zu erstellen:
Für mein .odtpdf
Ziel läuft LibreOffice im Headless-Modus. Hier sind die grundlegenden Befehlszeilen, die ich für verwende (ich arbeite unter OS X, also müssen Sie für Linux oder Windows die Pfade entsprechend anpassen). Achtung, Befehl ist in Makefile-Syntax -- kann ohne vorherige Anpassung nicht direkt in Shell verwendet werden:
(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 - ; )
Für mein .manpdf
Ziel wird es verwendet man -t
, um PostScript aus der Manpage-Ausgabedatei von Pandoc zu erstellen, und verwendet dann Ghostscript, um das PDF zu erstellen. Es lautet daher:
man -t <pandoc's manpage output file> \
| gs -o ${HOME}/<pandoc-sourcedoc-name>.pdf -sDEVICE=pdfwrite -
Der Nicht-LaTeX-Weg zu PDF via ODT ist für mich der "sexy"...
myreference.odt
! (Diese Stile werden dann natürlich auch in das PDF übertragen.)Ich kann dann den Pandoc-Befehl (über Makefile oder in der Shell) ausführen, um ein ODT nach meinen Wünschen zu erstellen, komplett mit den Schriftarten, -größen und -farben, die ich bevorzuge, mit den Seitengrößen und Seitenkopfzeilen, -fußzeilen oder -hintergründen, die ich definiert habe (wieder : Makefile-Syntax!):
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)/$@ \
$<
Der --from=markdown+...+...+
Parameter weist Pandoc an, mehrere Markdown-Syntaxerweiterungen zu akzeptieren, die ich gerne in meinen MD-Quelldateien verwende.
Das süße Geheimnis, um die Stile im ODT-Dokument zu erhalten, liegt im --reference-odt=/path/to/myreference.odt
Befehlszeilenparameter.
Die ODT-Ausgabe funktioniert sogar mit Referenzen und Literaturverzeichnis (wenn Ihre Markdown-Eingabe dafür richtig geschrieben ist) !
Prinzipiell sollte dieser Workflow auch unter Windows funktionieren, da Pandoc auch unter Windows läuft. Ich habe Pandoc schon einmal unter Windows ausgeführt, aber ich habe selbst keinen vollständig automatischen Workflow eingerichtet, zuerst " Pandoc
: Markdown -> ODT " , dann " .\soffice
: ODT-> PDF " basierend auf einem Makefile hier, aber ...
Aber vielleicht möchten Sie einen anderen Weg unter Windows erkunden :
Ja, Sie können auch die Stile der DOCX-Ausgabedateien anpassen, indem Sie den --reference-docx=my-reference.docx
Schalter verwenden. Erstellen Sie einfach zuerst eine my-reference.docx
Datei, die genau die gewünschten Stile verwendet. Pandoc extrahiert diese dann aus dem Referenzdokument und wendet sie auf das von ihm generierte Ausgabe-DOCX an!
Von dort aus können Sie sehen, wie Sie die DOCX-Zwischendatei in PDF konvertieren. Dies kann auch automatisch erfolgen: Sie können auch OfficeToPDF.exe in Betracht ziehen . Es wird auf CodePlex gehostet, ist mit der Apache 2.0-Lizenz lizenziert und in Binär- und Quellcode verfügbar.
Zu guter Letzt: Stellen Sie sicher, dass Sie die neueste und beste Version von Pandoc verwenden (derzeit v1.17.0.3 oder höher ) – in den letzten Monaten wurden viele Funktionen hinzugefügt, insb. wenn es um die DOCX-Ausgabe geht!
--latex-engine=xelatex
oder --latex-engine=lualatex
zu Ihrem Pandoc-Befehl hinzu. Die (Standard-)Engine pdflatex
kann Unicode nicht verarbeiten.Ich habe eine andere Möglichkeit untersucht. Im Vergleich zu Markdown-PDF :
Dies ist auch eine auf Nodejs basierende Lösung, die die Node-Pakete Marked und wkhtmltopdf verwendet.
npm -g install marked
npm -g install wkhtmltopdf
Zur Verwendung sind zwei CLI-Aufrufe erforderlich. Sie können dies natürlich einfach als Batch-Datei speichern und ausführen.
marked input.md -o output.html
wkhtmltopdf input.html output.pdf
* Da die Links funktionieren, kann ich zu dieser Methode anstelle von Markdown-PDF wechseln . In diesem Fall werde ich wahrscheinlich einen Wrapper schreiben, um etwas CSS hinzuzufügen (mit der Option, einen vernünftigen Standardwert oder einen Benutzerdefiniert hinzuzufügen). Der Wrapper würde auch einen Aufruf statt zwei zum Ausführen machen und könnte es wahrscheinlich zu einem npm install cmd anstelle der manuellen Installation machen. Wenn/wenn ich das mache, werde ich das hier teilen.
Ich konvertiere stattdessen einfach von HTML. Das funktioniert für meine Bedürfnisse:
https://github.com/dompdf/dompdf
Ich habe festgestellt, dass Markdown im Allgemeinen kein gutes Format zum Konvertieren in PDF ist, da es keine native CSS-Unterstützung bietet. Hier ist das Skript, das ich verwende:
<?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);
Diese Lösung benötigt nur PHP (25 MB) und DomPdf (4 MB), ist also im Vergleich zu anderen Optionen recht leichtgewichtig.
Um auf der Lösung von @nick-wilde aufzubauen, wenn Sie Grunt verwenden, gibt es Plugins sowohl für selected als auch für wkhtmltopdf:
Nach der Installation der wkhtmltopdf
Hauptbinärdatei können Sie die Plugins mit npm installieren:
npm install grunt-marked --save-dev
npm install grunt-wkhtmltopdf --save-dev
Dann verwenden Sie so etwas in Ihrem Gruntfile.js
:
marked: {
std : {
files: {
'out.html' : ['src.md']
}
}
},
wkhtmltopdf: {
std : {
src: 'out.html',
dest: 'out.pdf'
}
},
Dann rufen Sie in Ihrem Build die beiden einfach nacheinander auf:
grunt.registerTask('build', ['marked', 'wkhtmltopdf']);
Wenn Sie möchten, dass es hübsch aussieht, müssen Sie mehr mit den marked
Einstellungen herumspielen, aber ich bin sicher, dass es machbar ist.
Ich habe kürzlich einen Dienst zum Konvertieren von Markdown-Dokumenten in PDF erstellt. Es unterstützt GitHub-ähnliches Markdown sowie Syntax-Highlighting. Der Dienst befindet sich unter: http://markdown2pdf.com
Es ist nicht sexy, aber AbiWord konvertiert HTML in PDF.
Angenommen, Sie haben abiword installiert:
markdown some.md > some.html
abiword -t pdf -o some.pdf some.html
Nick Dickinson-Wilde
Ciro Santilli OurBigBook.com
Nick Dickinson-Wilde
Ciro Santilli OurBigBook.com
Nick Dickinson-Wilde
Dɑvïd
apt-get install retext
Befehl installieren."Ciro Santilli OurBigBook.com