Wie konvertiere ich Markdown ohne LaTeX in PDF?

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:

    • Gleitkommazahlen wie Code und Bild schweben nicht, daher erhalten Sie vertikale Leerzeichen bei Zeilenumbrüchen, wenn Sie große Gleitkommazahlen haben: https://github.com/asciidoctor/asciidoctor-pdf/issues/353
    • Einige Zeilen enthalten zu wenige Wörter, sind aber immer noch horizontal ausgerichtet, was zu zu viel Leerraum zwischen den Wörtern führt. TODO Ticket finden / erstellen.
  • 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:

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:

Interessiert es Sie, welches Betriebssystem/Web-App? Auch wie sieht es mit dem Preis aus?
@NickWilde Je freier desto besser, je mehr Kreuz desto besser. Linux-Unterstützung würde mich freuen. Aber ich will alle Optionen hören =)
Oh und vergessen zu fragen, welche Art von Schnittstelle Sie möchten - CLI oder GUI. Wenn ich CLI habe, habe ich eine Option, von der ich ziemlich sicher bin, dass sie LaTex nicht verwendet.
@NickWilde Ich bevorzuge CLI, aber ich möchte noch einmal alle wissen.
bevorzuge CLI, dann ist das großartig: D ... Antwort kommt gleich.
ReText ist ein Markdown-Editor mit integriertem PDF-Export. Das funktioniert meiner Erfahrung nach ganz gut. Von der Website: "Benutzer von Debian und Ubuntu können ReText mit dem apt-get install retextBefehl installieren."
@David danke für den Tipp. Ich habe es mir angesehen und es verwendet Qt, um die Arbeit zu erledigen. Auch zur Frage hinzugefügt.

Antworten (7)

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:

  1. Node.js installieren (falls erforderlich)
  2. Markdown-PDF installieren - von cmdline einfach ausführennpm install -g markdown-pdf
  3. run 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.

Backend: zu HTML mit Marked, dann PhantomJS. @NickWilde: Überleben deine <http://a.com>Links im PDF? Ich bekomme nur Bilder. Ich bin mir nicht sicher, ob dies mit PhantomJS möglich ist.
hmm ... Ich habe keine Links vom Typ <link> - nur Links vom Typ [name](link) oder [name][id] und sie funktionieren. Beide haben den Linktext nach dem Link, was nicht schön ist, aber wahrscheinlich mit einer kleinen Anpassung behoben werden könnte - das habe ich vergessen zu erwähnen.
Können Sie einmal auf den Link klicken und er öffnet sich im Browser? Welchen PDF-Viewer verwendest du? Für Evince und Okular bekomme ich nur einfachen Text. Ich habe es getestet und das gleiche gilt für [](), der Text erscheint rechts, was ein gutes Design ist, da die Links nicht anklickbar sind (für mich).
Ich verwende Windows (7)/Adobe Acrobat (XI) - der Titel ist nicht anklickbar, der Linktext ist (und ein Klick öffnet sich im bevorzugten Browser (nach Adobe-Sicherheitswarnung zum Öffnen von Links). Für mich ist das geringfügig, aber ich kann Sehen Sie, dass dies für einige Anwendungsfälle ein Problem sein könnte.
Mal sehen, ob ich das später beheben kann
Untersucht und es sieht so aus, als ob es das QT-Backend für Phantomjs ist (wie nicht leicht zu beheben ). Also etwas bearbeiten.

Ich persönlich bin ein großer Fan von pandoc.

Pandoc ist das "Schweizer-Armee"-Werkzeug für Formatkonvertierungen:

  • Das unterstützte Kernquelleingabeformat ist (einschließlich aller wichtigen MD-"Dialekte", wie z. B. die Varianten von GitHub und PHP sowie mehrere spezielle Erweiterungen) . MarkdownAndere Eingabeformate sind: HTML, rST, Textile, DocBook XML, MediaWiki.
  • Als Ausgabeformate werden unterstützt: ConTeXt, LaTeX, PDFund 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
    ...und: manpage(GROFF-Manpage) und ODT(OpenDocument-Text).

Sind Sie noch da? Gut.

Hast du die letzten beiden bemerkt, manpageund 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.mmdund dann die entsprechenden Befehle in Gang setzt: pandocum das PDF direkt zu erstellen (das im Hintergrund zuerst nach LaTeX konvertiert und dann pdflatexselbst ausgeführt wird), ODT oder Manpage. Dann ist der nächste Befehl, das endgültige Format zu erstellen:

  • Für mein .odtpdfZiel 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 .manpdfZiel 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 -
    

Passen Sie das Erscheinungsbild Ihrer ODT-Ausgabe an

Der Nicht-LaTeX-Weg zu PDF via ODT ist für mich der "sexy"...

  • ...denn Pandoc weiß, wie man einige nette personalisierte Stile auf ein Ziel-ODT anwendet, wenn nur diese Stile in einem richtig definiert sind 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.odtBefehlszeilenparameter.

Die ODT-Ausgabe funktioniert sogar mit Referenzen und Literaturverzeichnis (wenn Ihre Markdown-Eingabe dafür richtig geschrieben ist) !


Verwenden Sie Windows?

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 :

  • Erstellen Sie zuerst eine DOCX-Ausgabe von Pandoc;
  • Konvertieren Sie dann das DOCX in PDF (automatisch oder interaktiv über WinWord).

Ja, Sie können auch die Stile der DOCX-Ausgabedateien anpassen, indem Sie den --reference-docx=my-reference.docxSchalter verwenden. Erstellen Sie einfach zuerst eine my-reference.docxDatei, 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!

Meine Markdown-Datei enthält ein Unicode-Zeichen und Pandoc-Blöcke darauf. Wie könnte ich das beheben?
Fügen Sie --latex-engine=xelatexoder --latex-engine=lualatexzu Ihrem Pandoc-Befehl hinzu. Die (Standard-)Engine pdflatexkann Unicode nicht verarbeiten.

Ich habe eine andere Möglichkeit untersucht. Im Vergleich zu Markdown-PDF :

  • Vorteile:
    • Macht eigentlich richtige Links.
    • Eigentlich etwas schneller zu laufen
  • Nachteile:
    • Nicht so "hübsch" - bis auf die Links sieht mit Markdown-PDF alles schöner aus. Dies könnte jedoch leicht behoben werden, indem dem HTML-Code vor der PDF-Generierung etwas CSS hinzugefügt wird *.
    • Die Installation ist komplizierter.

Dies ist auch eine auf Nodejs basierende Lösung, die die Node-Pakete Marked und wkhtmltopdf verwendet.

Installation:

  • Nodejs installieren .
  • Marked installieren - am einfachsten über die Kommandozeile:npm -g install marked
  • Installieren Sie wkhtmltopdf NPM - am einfachsten über die Kommandozeile:npm -g install wkhtmltopdf
  • wkhtmltopdf -Hauptdateien installieren - kein Installationsprogramm verfügbar.
  • Fügen Sie dem PATH das Verzeichnis wkhtmltopdf bin hinzu

Verwendungszweck:

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.

Folgendes basiert auf wkhtmltopdf: github.com/pdfkit/pdfkit . Ich habe es nicht versucht, aber ich muss noch verstehen, was es tut, was wkhtmltopdf nicht tut.
Sieht so aus, als wäre das ein Ruby-Wrapper für wkhtmltopdf
Ich habe es nicht ausprobiert, daher kann ich nicht beurteilen, wie gut es funktioniert, aber dies ist auf der Seite der Installierbarkeit nicht sehr gut: Das Repo ist 1 GB groß und enthält eine 0,5-GB-Qt-Gabel!
Äh, ich vermute, das muss eher für PDFKit als für meine Empfehlung gelten - da meine Empfehlung eine Gesamtdownloadgröße von weit unter 30 MB hat - ~ 6 MB Nodejs, ~ 16 MB wkhtmltopdf und dann die Wrapper, die relativ klein sind (node-wkhtmltopdf ist 2,8 KB ).
Ah, ich habe über das wkhtmltopdf-Repository gesprochen , aber vielleicht enthalten sie Tonnen von Dingen, die nicht installiert sind. Vielen Dank.
Ja, das ist definitiv nicht in der Veröffentlichung - dieser Fork von QT ist wahrscheinlich dafür da, die Links in der PDF-Datei zu erstellen; und es muss ein vollständiger Fork sein, auch wenn nur ein Bruchteil davon in der Veröffentlichung verwendet wird.
Das einzige ernsthafte Problem, das ich bei selected festgestellt habe, ist, dass die HTML-Ausgabe keinen Zeichensatz-Header hat, sodass das HTML schlecht gerendert wird, zum Beispiel wird das Wort Corrección Corrección gerendert. Und die resultierende PDF-Datei ist auch schlecht generiert. Irgendeine Idee?

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 wkhtmltopdfHauptbinä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 markedEinstellungen 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

Ist es Open-Source? Was ist die zugrunde liegende Technik?

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
Danke für den Tipp. Vielleicht kann uns jemand sagen, welche Art von Backend er verwendet: generisch oder ein Drittanbieter-Tool wiederverwenden.