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