-->

пятница, 27 февраля 2015 г.

Генерация документов (DOC, HTML) из HTML-шаблона с использованием RazorEngine

Задача: генерировать юридические документы и письма-уведомления из html-шаблонов. Разметка в шаблонах несложная: в рамках тегов <b>, <i>, <table>. Однако, документы могут быть достаточно объемными (~10 стр.).


Реализация: основная предпосылка - страница с валидной html-разметкой может быть успешно открыта в Word и дальнейшая работа с ней абсолютно не отличается от работы с файлами doc/docx формата. Вы можете убедиться в этом, сохранив следующий код в текстовом файле и открыв в Word:

<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8" />
</head>
<body>
        <h1>Hello!</h1>
        lorem ipsum dolor sit amet
</body>
</html>

Что нам это дает:
  • нет необходимости работать с проприетарными форматами файлов;
  • одна и та же технология может использоваться для генерации как документов, так и писем с html-разметкой;
  • простота редактирования html и поддержки кода в целом.
Ура, мы изобрели динамическую генерацию html. Осталось решить 2 пустяковых вопроса: как мы будем параметризовать нашу разметку, и в каком виде ее хранить в проекте.
Как делать не надо:

Вполне логично использовать для наших целей ASP.NET MVC. Тут тебе и типизированные View, и лаконичный Razor-синтаксис, и мощный IntelliSence. Но разворачивать всё MVC-окружение ради генерации одного документа непрактично. Тут-то нам и поможет RazorEngine - движок для рендеринга html из Razor-разметки.
Для подробного примера по генерации html из шаблона, создадим новое консольное приложение и добавим в состав проекта файл Template.cshtml со следующим содержанием:

@model YourProject.TemplateViewModel
<html>
<head> 
<meta charset="utf-8" /></head>
<body>
        <h1>@Model.Title</h1>
        @Model.Body
</body>
</html>

Для файла необходимо установить свойства BuildAction: Content, Copy to Output Directory: Always.
Поскольку мы хотим пользоваться IntelliSence при редактировании шаблона, установим ASP.NET MVC, и, конечно, сам RazorEngine:
Install-Package Microsoft.AspNet.Mvc -Version 5.2.3
Install-Package RazorEngine -Version 3.6.1
За рендеринг html отвечает метод RazorEngine.Razor.Parse (помечен как Obsolete в новых версиях движка, но хорошо подходит для демонстрационных целей). Дальше без комментариев:

var model = new YourProject.TemplateViewModel
{
        Title = "Hello RazorEngine!",
        Body = "Stop string.Replace terror!"
};

string path = Environment.CurrentDirectory + "\\Template.cshtml";
string template = File.ReadAllText(path);
string result = RazorEngine.Razor.Parse(template, model);

Console.WriteLine(result);

Результат:

<html>
<head>
        <meta charset="utf-8" />
</head>
<body>
        <h1>Hello RazorEngine!</h1>
        Stop string.Replace terror!
</body>
</html>

Готово! Пусть не самое производительное, не самое технологичное решение, но простейший работоспособный пример можно развернуть буквально за 5 минут. Успехов!

Комментариев нет:

Отправить комментарий