Долго ли, коротко ли, вместе с новой Visual Studio 2017 в релиз вышел ASP.NET Core. Тулинг лишился приставки preview, как и все инфраструктурные сборки, поставляемые Microsoft'ом. На мой взгляд, фреймворк получился отличным, а история с cjproj=>xproj=>project.json=>csproj и поломанная совместимость при переходе с RC1 на RC2 — это всё же разумная плата за скорость развития. Ну да ладно, опустим дела минувших дней, и вернёмся к текущим реалиям.
А реалии таковы, что есть задачи, и есть инструменты которые их решают. В частности, передо мной встала задача генерирования PDF-документов средствами ASP.NET Core. «Хмм… Наверняка уже есть что-то готовое...», — подумал я. Как бы не так. Вернее готовые библиотеки для этого есть, но платные, а вот чего-то OpenSource'ного нет. «А как же iText?», — спросите вы. «AGPL», — ответит вам страничка с лицензией на гитхабе. Для OpenSource проектов бесплатно, а для коммерческого использования, извольте заплатить. Ну что ж, раз нет инструмента, решающего мою задачу, значит я сделаю его сам.
В области генерирования PDF самым железобетонным вариантом для меня является wkhtmltopdf. Алгоритм в данном случае простой — делаем HTML страницу с необходимыми данными — конвертируем её в PDF — Profit! Таким образом родилась обёртка над wkhtmltopdf. Всё что ей требуется для работы — это указать путь к исполняемому файлу wkhtmltopdf. В простейшем варианте это выглядит вот так:
var wkhtmltopdf = new FileInfo(@"C:Program Fileswkhtmltopdfbinwkhtmltopdf.exe");
var converter = new HtmlToPdfConverter(wkhtmltopdf);
var pdfBytes = converter.ConvertToPdf(html);
Для конвертирования используется поточный вариант работы. Данные передаются в stdin и забираются из stdout. Никаких временных файлов. Прекрасно работает в связке с ASP.NET Core. Опционально можно указать дополнительные параметры в виде формата и ориентации листа, отступов, максимального времени выполнения, ч/б режима, времени выполнения JavaScript'а, необходимости загрузки изображений. С полным списком параметров можно ознакомиться на GitHub.
Если хотя бы один человек решит свою проблему с помощью этого инструмента, значит он был создан не зря. Да пребудет с вами MIT.
Автор: бро