Как конвертировать Markdown в PDF без LaTeX?

Почти каждый существующий md to PDF проходит через LaTeX: kramdown, pandoc, multimarkdown и т. д.

Существуют ли варианты, которых нет ни на одном языке, например, с использованием бэкэнда, такого как Prawn , libharu или jsPDF ?

Пока нашел только:

  • asciidoctor-pdf Этот конвертер asciidoc на основе Prawn довольно активен и имеет много звездочек.

    Уценка до Asciidoc с Pandoc, и тогда это лучший вариант, который я когда-либо видел.

    Однако он не идеален для профессионального производства, в частности:

    • поплавки, такие как код и изображение, не... плавают, поэтому вы получаете вертикальные пробелы на разрывах строк, когда у вас большие поплавки: https://github.com/asciidoctor/asciidoctor-pdf/issues/353
    • в некоторых строках слишком мало слов, но они все равно выровнены по горизонтали, что приводит к слишком большому пробелу между словами. TODO найти/создать тикет.
  • Gimli , но он не кажется очень активным (последний коммит 7 месяцев назад). Бэкенд?

  • markdown_prawn . Не так много звезд. Последний коммит 3 года назад.

  • Экспериментальный преобразователь Kramdown Prawn . Экспериментальный.

  • cmarkpdf : CommonMark в PDF через libharu от @jgm. Экспериментальный.

  • Qt5 QPrinter . Используется редактором Retext через PyQt5 Python API . TODO-тест. Вероятно, это будет аналог решения, похожего на PhantomJS, но для Qt вместо браузера.

Если вы можете хорошо преобразовать подмножество HTML, сгенерированное из Markdown, в PDF, то это решение, но мне еще предстоит найти бесплатное программное обеспечение, которое делает это правильно. Например, преобразования PhantomJS нарушают ссылки уценки <http://a.com>, которые отображаются в виде простого стилизованного текста в PDF, а не в виде интерактивных ссылок, которые открываются в предпочтительном браузере, которые создаются с помощью преобразований LaTeX.

Не бесплатные возможности:

Связанный: Ruby только ТАК вопрос .

Почему мне это нужно: LaTeX медленный, выдает ужасные сообщения об ошибках, его сложно установить и он слишком сложен для небольшого подмножества, необходимого для Markdown.

Частичные решения:

Вам все равно, какая ОС/веб-приложение? Также как насчет цены?
@NickWilde Чем свободнее, тем лучше, чем больше раздражения, тем лучше. Поддержка Linux меня бы порадовала. Но я хочу услышать все варианты =)
Да, и забыл спросить, какой интерфейс вы хотите - CLI или GUI. Если у меня есть вариант CLI, я уверен, что он не использует LaTex.
@NickWilde Я предпочитаю CLI, но опять же, я хочу знать их все.
предпочитаю CLI, тогда это здорово :D... ответ сразу же придет.
ReText — это редактор Markdown со встроенным экспортом в PDF. Это работает довольно хорошо в моем опыте. С веб-сайта: «Пользователи Debian и Ubuntu могут установить ReText с помощью apt-get install retextкоманды».
@ Давид, спасибо за совет. Я изучил его, и он использует Qt для выполнения этой работы. Также добавлено к вопросу.

Ответы (7)

Пакет Node.js Markdown-PDF должен работать хорошо. Я использовал пакет Grunt , но только ради хорошего ответа я просто быстро запустил оригинал через командную строку ; да и работает отлично.

Итак, чтобы использовать интерфейс командной строки Markdown-PDF , просто:

  1. Установите Node.js (при необходимости)
  2. Установите Markdown-PDF - просто запустите из командной строкиnpm install -g markdown-pdf
  3. run markdown-pdf -o readme.pdf readme.md(или любой другой источник и место назначения и другие параметры, которые вы хотите; см. Параметры CLI для получения подробной информации о том, что вы можете указать).

Это Open-Source (лицензия MIT), и у него есть репозиторий Github , он бесплатный и, насколько я понял, довольно быстрый.

Может быть небольшая проблема с получением изображений с доменов https://, но я не исследовал, что там происходит - одно из моих изображений не загружается, поэтому, скорее всего, это просто что-то смешное в моем md, но есть небольшая проблема. шанс, что это ошибка.

Один существенный баг: кликабельные ссылки не создаются.

Бэкенд: в HTML с использованием Marked, затем PhantomJS. @NickWilde: ваши <http://a.com>ссылки сохранились в PDF? Я получаю только изображения. Не уверен, что это возможно с PhantomJS.
хм... У меня нет ссылок типа <link> - только ссылки типа [name](link) или [name][id] и они работают. У них обоих есть текст ссылки после ссылки, которая некрасива, но, вероятно, может быть исправлена ​​​​незначительной корректировкой - я забыл упомянуть об этом.
Можно ли щелкнуть ссылку один раз, и она откроется в браузере? Какую программу просмотра PDF вы используете? Для Evince и Okular я получаю только обычный текст. Я проверил и то же самое для [](), текст появляется справа, что является хорошим дизайном, поскольку ссылки не кликабельны (для меня).
Я на Windows (7)/Adobe Acrobat (XI) - заголовок не кликабельный, текст ссылки (и один щелчок открывается в предпочтительном браузере (после предупреждения безопасности Adobe об открытии ссылок). Для меня это незначительно, однако я могу видите, что это может быть серьезной проблемой для некоторых вариантов использования.
Я посмотрю, смогу ли я исправить это позже
Исследовано, и похоже, что это бэкэнд QT для phantomjs (так как это нелегко исправить). Так что редактирую немного.

Я лично большой поклонник pandoc.

Pandoc — это «швейцарский армейский» инструмент преобразования форматов:

  • Поддерживается его основной исходный формат вводаMarkdown (включая любой из основных «диалектов» MD, таких как разновидности GitHub и PHP, а также несколько специальных расширений). Другие входные форматы: HTML, rST, Textile, DocBook XML, MediaWiki.
  • В качестве форматов вывода он поддерживает: ConTeXt, LaTeX, PDFи Beamer PDF(хотя требуется LaTeX в фоновом режиме), MediaWiki, DOCX, DocBook, rST, Textile, ASCIIDoc, texinfo, org(режим организации Emacs), S5(слайды HTML), Slidy(слайды HTML), Slideous(слайды HTML), ImpressJS(слайды HTML ). ), DZSlides(слайды HTML), HTML, HTML5, EPUB, EPUB3
    ...и: manpage(справочная страница GROFF) и ODT(текст OpenDocument).

Ты все еще со мной? Хороший.

Вы обратили внимание на последние два manpageи ODT?

Что ж, это два выходных формата, которыми я лично «злоупотребляю» как промежуточными форматами, чтобы получить PDF для окончательных документов, когда я не хочу использовать LaTeX.

Я автоматизировал свой рабочий процесс и цепочку процессов с помощью Makefile . Так что мне просто нужно ввести make mydoc.latexpdf, или make mydoc.odtpdf, или make mydoc.manpdf. Makefile настроен на поиск ввода 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для создания PostScript из выходного файла man-страницы Pandoc, а затем использует Ghostscript для создания PDF. Поэтому он работает:

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

Настройте внешний вид выходных данных ODT

Не-LaTeX путь к PDF через ODT для меня самый "привлекательный"...

  • ...потому что Pandoc знает, как применить некоторые приятные персонализированные стили к целевому ODT, если только эти стили правильно определены в файле myreference.odt! (Конечно, эти стили также будут перенесены в PDF.)

Затем я могу запустить команду Pandoc (через Makefile или в оболочке), чтобы создать 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, что нужно принять несколько расширений синтаксиса Markdown, которые мне нравится использовать в моих исходных файлах MD.

Сладкий секрет получения стилей в документе ODT заключается в --reference-odt=/path/to/myreference.odtпараметре командной строки.

Вывод ODT работает даже со ссылками и библиографией (если ваш ввод Markdown правильно написан для этого) !


Используете Windows?

В принципе, этот рабочий процесс должен работать и в Windows, потому что Pandoc тоже работает в Windows. Я запускал Pandoc в Windows раньше, но я сам не настроил полностью автоматический рабочий процесс, сначала « Pandoc: Markdown -> ODT » , затем « .\soffice: ODT-> PDF » на основе Makefile здесь, хотя...

Но вы можете изучить другой путь в Windows :

  • сначала создайте вывод DOCX из Pandoc;
  • затем конвертируйте DOCX в PDF (автоматически или интерактивно через WinWord).

Да, вы также можете настроить стили выходных файлов DOCX с помощью --reference-docx=my-reference.docxпереключателя. Просто сначала создайте my-reference.docxфайл, который использует именно те стили, которые вам нужны. Затем Pandoc извлечет их из справочного документа и применит к выходному DOCX, который он генерирует!

Оттуда вы можете посмотреть, как преобразовать промежуточный файл DOCX в PDF. Это также можно сделать автоматически: вы также можете использовать OfficeToPDF.exe . Он размещен на CodePlex, лицензирован Apache 2.0 License и доступен в двоичном и исходном коде.

Наконец: обязательно используйте самую последнюю и самую лучшую версию Pandoc (в настоящее время v1.17.0.3 или более позднюю ) - за последние месяцы было добавлено много функций, особенно. когда дело доходит до вывода DOCX!

Мой файл уценки содержит символ юникода и блоки pandoc. Как я мог это исправить?
Добавьте --latex-engine=xelatexили --latex-engine=lualatexк вашей команде Pandoc. Механизм (по умолчанию) pdflatexне может обрабатывать Unicode.

Я исследовал другой вариант. По сравнению с Markdown-PDF :

  • Плюсы:
    • На самом деле делает правильные ссылки.
    • На самом деле немного быстрее бежать
  • Минусы:
    • Не так "красиво" - за исключением ссылок, с Markdown-PDF все выглядит симпатичнее. Это можно легко исправить, добавив немного CSS в HTML перед созданием PDF*.
    • Установка сложнее.

Это также решение на основе Nodejs , в котором используются пакеты узлов Marked и wkhtmltopdf .

Монтаж:

  • Установите Нодейс .
  • Установить Marked — проще всего через командную строку: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 вместо ручной установки. Если/когда я это сделаю, я поделюсь этим здесь.

Следующее основано на wkhtmltopdf: github.com/pdfkit/pdfkit . Не пробовал, но я еще не понял, что он делает, чего не делает wkhtmltopdf.
Похоже, это рубиновая оболочка для wkhtmltopdf.
Я не пробовал его, поэтому не могу оценить, насколько хорошо он работает, но это не очень хорошо с точки зрения возможности установки: репозиторий занимает 1 ГБ и включает форк Qt на 0,5 ГБ!
Э-э, я предполагаю, что это должно быть для PDFKit, а не для моей рекомендации - потому что моя рекомендация имеет общий размер загрузки значительно меньше 30 МБ - ~ 6 МБ Nodejs, ~ 16 МБ wkhtmltopdf, а затем относительно небольшие обертки (node-wkhtmltopdf составляет 2,8 КБ ).
Ах, я говорил о репозитории wkhtmltopdf , но, может быть, они включают в себя массу вещей, которые не установлены. Спасибо.
Да, этого определенно нет в релизе - этот форк QT, вероятно, предназначен для того, чтобы ссылки в pdf работали; и это должен быть полный форк, даже если в релизе используется только его часть.
Единственная серьезная проблема, которую я обнаружил с пометкой, заключается в том, что вывод html не имеет заголовка набора символов, поэтому html плохо отображается, например, слово Corrección отображается как Corrección. И полученный файл PDF тоже плохо сгенерирован. Есть идеи?

Вместо этого я просто конвертирую из 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 МБ) и DomPdf (4 МБ), поэтому он довольно легкий по сравнению с другими вариантами.

Чтобы использовать решение @nick-wild, если вы используете grunt, есть плагины как для помеченных, так и для wkhtmltopdf:

После установки основного wkhtmltopdfбинарного файла вы можете установить плагины с помощью npm:

npm install grunt-marked --save-dev
npm install grunt-wkhtmltopdf --save-dev

Затем используйте что-то вроде этого в своем Gruntfile.js:

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

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

Затем в вашей сборке вы просто вызываете два последовательно:

grunt.registerTask('build', ['marked', 'wkhtmltopdf']);

Если вы хотите, чтобы это выглядело красиво, вам придется больше возиться с markedнастройками, но я уверен, что это выполнимо.

Недавно я создал сервис для преобразования документов уценки в PDF. Он поддерживает уценку в стиле GitHub, а также подсветку синтаксиса. Сервис находится по адресу: http://markdown2pdf.com

Это с открытым исходным кодом? Что лежит в основе техники?

Это не красиво, но AbiWord конвертирует HTML в PDF.

Итак, если у вас установлен abiword:

markdown some.md > some.html  
abiword -t pdf -o some.pdf some.html
Спасибо за чаевые. Может быть, кто-нибудь может сказать нам, какой тип бэкэнда они используют: общий или повторно использовать сторонний инструмент.