|
7 | 7 | using System.Linq;
|
8 | 8 | using System.Text;
|
9 | 9 |
|
10 |
| -namespace ArrayToPdf |
| 10 | +namespace ArrayToPdf; |
| 11 | + |
| 12 | +public class ArrayToPdf |
11 | 13 | {
|
12 |
| - public class ArrayToPdf |
13 |
| - { |
14 | 14 | #if !NET45
|
15 |
| - static ArrayToPdf() |
16 |
| - { |
17 |
| - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); |
18 |
| - } |
| 15 | + static ArrayToPdf() |
| 16 | + { |
| 17 | + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); |
| 18 | + } |
19 | 19 | #endif
|
20 | 20 |
|
21 |
| - public static MemoryStream CreatePdf<T>(IEnumerable<T> items, Action<SchemaBuilder<T>>? schema = null) |
22 |
| - { |
23 |
| - var builder = new SchemaBuilder<T>(items); |
24 |
| - schema?.Invoke(builder); |
25 |
| - return _createPdf(builder.Schema); |
26 |
| - } |
| 21 | + public static MemoryStream CreatePdf<T>(IEnumerable<T> items, Action<SchemaBuilder<T>>? schema = null) |
| 22 | + { |
| 23 | + var ms = new MemoryStream(); |
| 24 | + CreatePdf(ms, items, schema); |
| 25 | + ms.Position = 0; |
| 26 | + return ms; |
| 27 | + } |
27 | 28 |
|
28 |
| - static MemoryStream _createPdf(Schema schema) |
29 |
| - { |
30 |
| - var ms = new MemoryStream(); |
31 |
| - var renderer = new PdfDocumentRenderer(true); |
32 |
| - renderer.Document = _createDocument(schema); |
33 |
| - renderer.RenderDocument(); |
34 |
| - renderer.PdfDocument.Save(ms); |
35 |
| - ms.Position = 0; |
36 |
| - return ms; |
37 |
| - } |
| 29 | + public static void CreatePdf<T>(Stream stream, IEnumerable<T> items, Action<SchemaBuilder<T>>? schema = null) |
| 30 | + { |
| 31 | + var builder = new SchemaBuilder<T>(items); |
| 32 | + schema?.Invoke(builder); |
| 33 | + CreatePdf(stream, builder.Schema); |
| 34 | + } |
38 | 35 |
|
39 |
| - static readonly int _tableLeftBias = -1; |
| 36 | + static void CreatePdf(Stream stream, Schema schema) |
| 37 | + { |
| 38 | + var renderer = new PdfDocumentRenderer(true); |
| 39 | + renderer.Document = CreateDocument(schema); |
| 40 | + renderer.RenderDocument(); |
| 41 | + renderer.PdfDocument.Save(stream); |
| 42 | + } |
40 | 43 |
|
41 |
| - static Document _createDocument(Schema schema) |
42 |
| - { |
43 |
| - var document = new Document(); |
44 |
| - document.UseCmykColor = true; |
45 |
| - document.Info.Title = schema.Title; |
46 |
| - document.Info.Subject = schema.Subject; |
47 |
| - document.Info.Author = schema.Author; |
48 |
| - |
49 |
| - document.DefaultPageSetup.PageFormat = (PageFormat)schema.PageFormat; |
50 |
| - document.DefaultPageSetup.Orientation = (Orientation)schema.PageOrientation; |
51 |
| - document.DefaultPageSetup.HeaderDistance = Unit.FromMillimeter(schema.PageMarginTop); |
52 |
| - document.DefaultPageSetup.FooterDistance = Unit.FromMillimeter(schema.PageMarginBottom); |
53 |
| - document.DefaultPageSetup.TopMargin = Unit.FromMillimeter(schema.PageMarginTop + (string.IsNullOrWhiteSpace(schema.Header) ? 0 : schema.HeaderHeight)); |
54 |
| - document.DefaultPageSetup.RightMargin = Unit.FromMillimeter(schema.PageMarginRight + _tableLeftBias); |
55 |
| - document.DefaultPageSetup.BottomMargin = Unit.FromMillimeter(schema.PageMarginBottom + (string.IsNullOrWhiteSpace(schema.Footer) ? 0 : schema.FooterHeight)); |
56 |
| - document.DefaultPageSetup.LeftMargin = Unit.FromMillimeter(schema.PageMarginLeft - _tableLeftBias); |
57 |
| - |
58 |
| - Unit width, height; |
59 |
| - PageSetup.GetPageSize(document.DefaultPageSetup.PageFormat, out width, out height); |
60 |
| - document.DefaultPageSetup.PageWidth = width; |
61 |
| - document.DefaultPageSetup.PageHeight = height; |
62 |
| - |
63 |
| - var innerWidth = Unit.FromPoint(document.DefaultPageSetup.GetWidth() - document.DefaultPageSetup.LeftMargin - document.DefaultPageSetup.RightMargin); |
64 |
| - |
65 |
| - _addStyles(document, innerWidth); |
66 |
| - _addSection(document); |
67 |
| - _addHeader(document, innerWidth, schema); |
68 |
| - _addFooter(document, innerWidth, schema); |
69 |
| - _addTable(document, innerWidth, schema); |
70 |
| - |
71 |
| - return document; |
72 |
| - } |
| 44 | + static readonly int _tableLeftBias = -1; |
73 | 45 |
|
74 |
| - static void _addStyles(Document document, Unit innerWidth) |
75 |
| - { |
76 |
| - var style = document.Styles[StyleNames.Header]; |
77 |
| - style.ParagraphFormat.AddTabStop(Unit.FromMillimeter(innerWidth.Millimeter + _tableLeftBias), TabAlignment.Right); |
| 46 | + static Document CreateDocument(Schema schema) |
| 47 | + { |
| 48 | + var document = new Document(); |
| 49 | + document.UseCmykColor = true; |
| 50 | + document.Info.Title = schema.Title; |
| 51 | + document.Info.Subject = schema.Subject; |
| 52 | + document.Info.Author = schema.Author; |
| 53 | + |
| 54 | + document.DefaultPageSetup.PageFormat = (PageFormat)schema.PageFormat; |
| 55 | + document.DefaultPageSetup.Orientation = (Orientation)schema.PageOrientation; |
| 56 | + document.DefaultPageSetup.HeaderDistance = Unit.FromMillimeter(schema.PageMarginTop); |
| 57 | + document.DefaultPageSetup.FooterDistance = Unit.FromMillimeter(schema.PageMarginBottom); |
| 58 | + document.DefaultPageSetup.TopMargin = Unit.FromMillimeter(schema.PageMarginTop + (string.IsNullOrWhiteSpace(schema.Header) ? 0 : schema.HeaderHeight)); |
| 59 | + document.DefaultPageSetup.RightMargin = Unit.FromMillimeter(schema.PageMarginRight + _tableLeftBias); |
| 60 | + document.DefaultPageSetup.BottomMargin = Unit.FromMillimeter(schema.PageMarginBottom + (string.IsNullOrWhiteSpace(schema.Footer) ? 0 : schema.FooterHeight)); |
| 61 | + document.DefaultPageSetup.LeftMargin = Unit.FromMillimeter(schema.PageMarginLeft - _tableLeftBias); |
| 62 | + |
| 63 | + PageSetup.GetPageSize(document.DefaultPageSetup.PageFormat, out var width, out var height); |
| 64 | + document.DefaultPageSetup.PageWidth = width; |
| 65 | + document.DefaultPageSetup.PageHeight = height; |
| 66 | + |
| 67 | + var innerWidth = Unit.FromPoint(document.DefaultPageSetup.GetWidth() - document.DefaultPageSetup.LeftMargin - document.DefaultPageSetup.RightMargin); |
| 68 | + |
| 69 | + AddStyles(document, innerWidth); |
| 70 | + AddSection(document); |
| 71 | + AddHeader(document, schema); |
| 72 | + AddFooter(document, schema); |
| 73 | + AddTable(document, innerWidth, schema); |
| 74 | + |
| 75 | + return document; |
| 76 | + } |
78 | 77 |
|
79 |
| - style = document.Styles[StyleNames.Footer]; |
80 |
| - style.ParagraphFormat.AddTabStop(Unit.FromMillimeter(innerWidth.Millimeter + _tableLeftBias), TabAlignment.Right); |
81 |
| - } |
| 78 | + static void AddStyles(Document document, Unit innerWidth) |
| 79 | + { |
| 80 | + var style = document.Styles[StyleNames.Header]; |
| 81 | + style.ParagraphFormat.AddTabStop(Unit.FromMillimeter(innerWidth.Millimeter + _tableLeftBias), TabAlignment.Right); |
82 | 82 |
|
83 |
| - static void _addSection(Document document) |
84 |
| - { |
85 |
| - var section = document.AddSection(); |
86 |
| - section.PageSetup = document.DefaultPageSetup.Clone(); |
87 |
| - } |
| 83 | + style = document.Styles[StyleNames.Footer]; |
| 84 | + style.ParagraphFormat.AddTabStop(Unit.FromMillimeter(innerWidth.Millimeter + _tableLeftBias), TabAlignment.Right); |
| 85 | + } |
88 | 86 |
|
89 |
| - static void _addHeader(Document document, Unit innerWidth, Schema schema) |
90 |
| - { |
91 |
| - if (string.IsNullOrWhiteSpace(schema.Header)) |
92 |
| - return; |
93 |
| - |
94 |
| - var header = document.LastSection.Headers.Primary; |
95 |
| - var paragraph = header.AddParagraph(); |
96 |
| - paragraph.Format.LeftIndent = Unit.FromMillimeter(_tableLeftBias); |
97 |
| - paragraph.Format.Alignment = (ParagraphAlignment)schema.HeaderAlignment; |
98 |
| - paragraph.Format.Font.Size = schema.HeaderFontSize; |
99 |
| - paragraph.Format.Font.Bold = schema.HeaderFontBold; |
100 |
| - _addTmpText(paragraph, schema.Header, schema); |
101 |
| - } |
| 87 | + static void AddSection(Document document) |
| 88 | + { |
| 89 | + var section = document.AddSection(); |
| 90 | + section.PageSetup = document.DefaultPageSetup.Clone(); |
| 91 | + } |
102 | 92 |
|
103 |
| - static void _addFooter(Document document, Unit innerWidth, Schema schema) |
104 |
| - { |
105 |
| - if (string.IsNullOrWhiteSpace(schema.Footer)) |
106 |
| - return; |
107 |
| - |
108 |
| - var footer = document.LastSection.Footers.Primary; |
109 |
| - var paragraph = footer.AddParagraph(); |
110 |
| - paragraph.Format.LeftIndent = Unit.FromMillimeter(_tableLeftBias); |
111 |
| - paragraph.Format.Alignment = (ParagraphAlignment)schema.FooterAlignment; |
112 |
| - paragraph.Format.Font.Size = schema.FooterFontSize; |
113 |
| - paragraph.Format.Font.Bold = schema.FooterFontBold; |
114 |
| - _addTmpText(paragraph, schema.Footer, schema); |
115 |
| - } |
| 93 | + static void AddHeader(Document document, Schema schema) |
| 94 | + { |
| 95 | + if (string.IsNullOrWhiteSpace(schema.Header)) |
| 96 | + return; |
| 97 | + |
| 98 | + var header = document.LastSection.Headers.Primary; |
| 99 | + var paragraph = header.AddParagraph(); |
| 100 | + paragraph.Format.LeftIndent = Unit.FromMillimeter(_tableLeftBias); |
| 101 | + paragraph.Format.Alignment = (ParagraphAlignment)schema.HeaderAlignment; |
| 102 | + paragraph.Format.Font.Size = schema.HeaderFontSize; |
| 103 | + paragraph.Format.Font.Bold = schema.HeaderFontBold; |
| 104 | + AddTmpText(paragraph, schema.Header, schema); |
| 105 | + } |
116 | 106 |
|
117 |
| - static void _addTmpText(Paragraph paragraph, string? template, Schema schema) |
118 |
| - { |
119 |
| - if(template != null) |
120 |
| - foreach (var part in template.Split(new[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries)) |
121 |
| - switch (part) |
122 |
| - { |
123 |
| - case "TITLE": |
124 |
| - paragraph.AddText(schema.Title ?? string.Empty); |
125 |
| - break; |
126 |
| - case "PAGE": |
127 |
| - paragraph.AddPageField(); |
128 |
| - break; |
129 |
| - case "PAGES": |
130 |
| - paragraph.AddNumPagesField(); |
131 |
| - break; |
132 |
| - default: |
133 |
| - paragraph.AddText(part); |
134 |
| - break; |
135 |
| - } |
136 |
| - } |
| 107 | + static void AddFooter(Document document, Schema schema) |
| 108 | + { |
| 109 | + if (string.IsNullOrWhiteSpace(schema.Footer)) |
| 110 | + return; |
| 111 | + |
| 112 | + var footer = document.LastSection.Footers.Primary; |
| 113 | + var paragraph = footer.AddParagraph(); |
| 114 | + paragraph.Format.LeftIndent = Unit.FromMillimeter(_tableLeftBias); |
| 115 | + paragraph.Format.Alignment = (ParagraphAlignment)schema.FooterAlignment; |
| 116 | + paragraph.Format.Font.Size = schema.FooterFontSize; |
| 117 | + paragraph.Format.Font.Bold = schema.FooterFontBold; |
| 118 | + AddTmpText(paragraph, schema.Footer, schema); |
| 119 | + } |
137 | 120 |
|
138 |
| - static void _addTable(Document document, Unit innerWidth, Schema schema) |
139 |
| - { |
140 |
| - if (schema.Columns.Count == 0) |
141 |
| - return; |
| 121 | + static void AddTmpText(Paragraph paragraph, string? template, Schema schema) |
| 122 | + { |
| 123 | + if(template != null) |
| 124 | + foreach (var part in template.Split(new[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries)) |
| 125 | + switch (part) |
| 126 | + { |
| 127 | + case "TITLE": |
| 128 | + paragraph.AddText(schema.Title ?? string.Empty); |
| 129 | + break; |
| 130 | + case "PAGE": |
| 131 | + paragraph.AddPageField(); |
| 132 | + break; |
| 133 | + case "PAGES": |
| 134 | + paragraph.AddNumPagesField(); |
| 135 | + break; |
| 136 | + default: |
| 137 | + paragraph.AddText(part); |
| 138 | + break; |
| 139 | + } |
| 140 | + } |
142 | 141 |
|
143 |
| - var table = new Table(); |
144 |
| - table.Format.Font.Size = Unit.FromPoint(schema.TableFontSize); |
145 |
| - table.Borders.Width = 0.5; |
| 142 | + static void AddTable(Document document, Unit innerWidth, Schema schema) |
| 143 | + { |
| 144 | + if (schema.Columns.Count == 0) |
| 145 | + return; |
146 | 146 |
|
| 147 | + var table = new Table(); |
| 148 | + table.Format.Font.Size = Unit.FromPoint(schema.TableFontSize); |
| 149 | + table.Borders.Width = 0.5; |
147 | 150 |
|
148 |
| - var colWidth = Unit.FromPoint(innerWidth / schema.Columns.Count); |
149 |
| - var settedWidth = schema.Columns.Sum(x => x.Width ?? 0); |
150 |
| - var autoWidthCount = schema.Columns.Count(x => !x.Width.HasValue); |
151 |
| - var autoWidth = (innerWidth.Millimeter - settedWidth) / (autoWidthCount > 0 ? autoWidthCount : 1); |
152 | 151 |
|
153 |
| - // create columns |
154 |
| - schema.Columns.ForEach(x => table.AddColumn(Unit.FromMillimeter(x.Width ?? autoWidth)).Format.Alignment = (ParagraphAlignment)(x.Alignment ?? schema.TableAlignment)); |
| 152 | + var colWidth = Unit.FromPoint(innerWidth / schema.Columns.Count); |
| 153 | + var settedWidth = schema.Columns.Sum(x => x.Width ?? 0); |
| 154 | + var autoWidthCount = schema.Columns.Count(x => !x.Width.HasValue); |
| 155 | + var autoWidth = (innerWidth.Millimeter - settedWidth) / (autoWidthCount > 0 ? autoWidthCount : 1); |
155 | 156 |
|
156 |
| - // add header |
157 |
| - var row = table.AddRow(); |
158 |
| - row.TopPadding = 2; |
159 |
| - row.BottomPadding = 2; |
160 |
| - row.HeadingFormat = true; |
161 |
| - row.Format.Font.Bold = true; |
162 |
| - row.Shading.Color = Colors.LightGray; |
163 |
| - row.VerticalAlignment = VerticalAlignment.Center; |
| 157 | + // create columns |
| 158 | + schema.Columns.ForEach(x => table.AddColumn(Unit.FromMillimeter(x.Width ?? autoWidth)).Format.Alignment = (ParagraphAlignment)(x.Alignment ?? schema.TableAlignment)); |
164 | 159 |
|
165 |
| - var colIndex = 0; |
166 |
| - schema.Columns.ForEach(x => row.Cells[colIndex++].AddParagraph(x.Name ?? string.Empty)); |
| 160 | + // add header |
| 161 | + var row = table.AddRow(); |
| 162 | + row.TopPadding = 2; |
| 163 | + row.BottomPadding = 2; |
| 164 | + row.HeadingFormat = true; |
| 165 | + row.Format.Font.Bold = true; |
| 166 | + row.Shading.Color = Colors.LightGray; |
| 167 | + row.VerticalAlignment = VerticalAlignment.Center; |
167 | 168 |
|
168 |
| - // add rows |
169 |
| - foreach (var item in schema.Items) |
170 |
| - { |
171 |
| - row = table.AddRow(); |
172 |
| - row.TopPadding = 1; |
173 |
| - row.BottomPadding = 1; |
174 |
| - row.VerticalAlignment = VerticalAlignment.Center; |
| 169 | + var colIndex = 0; |
| 170 | + schema.Columns.ForEach(x => row.Cells[colIndex++].AddParagraph(x.Name ?? string.Empty)); |
175 | 171 |
|
176 |
| - colIndex = 0; |
177 |
| - foreach (var col in schema.Columns) |
178 |
| - { |
179 |
| - var value = col.Value?.Invoke(item); |
180 |
| - var cell = row.Cells[colIndex++]; |
181 |
| - cell.AddParagraph(value?.ToString() ?? string.Empty); |
182 |
| - } |
183 |
| - } |
| 172 | + // add rows |
| 173 | + foreach (var item in schema.Items) |
| 174 | + { |
| 175 | + row = table.AddRow(); |
| 176 | + row.TopPadding = 1; |
| 177 | + row.BottomPadding = 1; |
| 178 | + row.VerticalAlignment = VerticalAlignment.Center; |
184 | 179 |
|
185 |
| - //table.SetEdge(0, 0, scheme.Columns.Count, itemsCount+1, Edge.Box, BorderStyle.Single, 1, Colors.Black); |
186 |
| - document.LastSection.Add(table); |
| 180 | + colIndex = 0; |
| 181 | + foreach (var col in schema.Columns) |
| 182 | + { |
| 183 | + var value = col.Value?.Invoke(item); |
| 184 | + var cell = row.Cells[colIndex++]; |
| 185 | + cell.AddParagraph(value?.ToString() ?? string.Empty); |
| 186 | + } |
187 | 187 | }
|
188 | 188 |
|
| 189 | + //table.SetEdge(0, 0, scheme.Columns.Count, itemsCount+1, Edge.Box, BorderStyle.Single, 1, Colors.Black); |
| 190 | + document.LastSection.Add(table); |
189 | 191 | }
|
| 192 | + |
190 | 193 | }
|
0 commit comments