/
PrintViewBuilder.cs
90 lines (77 loc) · 4 KB
/
PrintViewBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.IO;
using System.Threading.Tasks;
using InfinniPlatform.PrintView.Defaults;
using InfinniPlatform.Serialization;
namespace InfinniPlatform.PrintView
{
/// <summary>
/// Построитель печатного представления.
/// </summary>
/// <remarks>
/// Предполагается, что в явном виде этот класс будет создаваться только в редакторе
/// печатных представлений. В иных случаях будет использоваться IoC контейнер.
/// </remarks>
public class PrintViewBuilder : IPrintViewBuilder
{
/// <summary>
/// Конструктор.
/// </summary>
public PrintViewBuilder(IJsonObjectSerializer printViewSerializer,
IPrintDocumentBuilder printDocumentBuilder,
IPrintViewWriter printViewWriter)
{
_printViewSerializer = printViewSerializer;
_printDocumentBuilder = printDocumentBuilder;
_printViewWriter = printViewWriter;
}
private readonly IJsonObjectSerializer _printViewSerializer;
private readonly IPrintDocumentBuilder _printDocumentBuilder;
private readonly IPrintViewWriter _printViewWriter;
/// <summary>
/// Создает файл печатного представления.
/// </summary>
/// <param name="stream">Поток для записи печатного представления.</param>
/// <param name="template">Шаблон печатного представления.</param>
/// <param name="dataSource">Данные печатного представления.</param>
/// <param name="fileFormat">Формат файла печатного представления.</param>
public Task Build(Stream stream, Func<Stream> template, object dataSource = null, PrintViewFileFormat fileFormat = PrintViewFileFormat.Pdf)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
PrintDocument documentTemplate;
using (var templateStream = template())
{
documentTemplate = _printViewSerializer.Deserialize<PrintDocument>(templateStream);
}
return Build(stream, documentTemplate, dataSource, fileFormat);
}
/// <summary>
/// Создает файл печатного представления.
/// </summary>
/// <param name="stream">Поток для записи печатного представления.</param>
/// <param name="template">Шаблон печатного представления.</param>
/// <param name="dataSource">Данные печатного представления.</param>
/// <param name="fileFormat">Формат файла печатного представления.</param>
public async Task Build(Stream stream, PrintDocument template, object dataSource = null, PrintViewFileFormat fileFormat = PrintViewFileFormat.Pdf)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
if (string.IsNullOrWhiteSpace(template.Source) && string.IsNullOrWhiteSpace(template.Expression))
{
template.Source = PrintViewDefaults.RootSource;
}
// Формирование документа печатного представления
var document = _printDocumentBuilder.Build(template, dataSource);
if (document != null)
{
// Сохранение документа печатного представления в указанном формате
await _printViewWriter.Write(stream, document, fileFormat);
}
}
}
}