Skip to content

Commit 4b9b24a

Browse files
committed
2.1.0
1 parent 0af64c7 commit 4b9b24a

22 files changed

+505
-490
lines changed

ArrayToPdf.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ EndProject
88
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CCA9C452-C78D-4C97-B4C0-2E730CF4B30C}"
99
ProjectSection(SolutionItems) = preProject
1010
.gitignore = .gitignore
11+
pack.ps1 = pack.ps1
1112
README.md = README.md
1213
EndProjectSection
1314
EndProject

ArrayToPdf/ArrayToPdf.cs

Lines changed: 157 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -7,184 +7,187 @@
77
using System.Linq;
88
using System.Text;
99

10-
namespace ArrayToPdf
10+
namespace ArrayToPdf;
11+
12+
public class ArrayToPdf
1113
{
12-
public class ArrayToPdf
13-
{
1414
#if !NET45
15-
static ArrayToPdf()
16-
{
17-
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
18-
}
15+
static ArrayToPdf()
16+
{
17+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
18+
}
1919
#endif
2020

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+
}
2728

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+
}
3835

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+
}
4043

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;
7345

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+
}
7877

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);
8282

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+
}
8886

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+
}
10292

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+
}
116106

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+
}
137120

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+
}
142141

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;
146146

147+
var table = new Table();
148+
table.Format.Font.Size = Unit.FromPoint(schema.TableFontSize);
149+
table.Borders.Width = 0.5;
147150

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);
152151

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);
155156

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));
164159

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;
167168

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));
175171

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;
184179

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+
}
187187
}
188188

189+
//table.SetEdge(0, 0, scheme.Columns.Count, itemsCount+1, Edge.Box, BorderStyle.Single, 1, Colors.Black);
190+
document.LastSection.Add(table);
189191
}
192+
190193
}

ArrayToPdf/ArrayToPdf.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net45;netstandard2.0;net6.0;net7.0</TargetFrameworks>
4+
<TargetFrameworks>net45;netstandard2.0;net6.0;net7.0;net8.0</TargetFrameworks>
55
<LangVersion>latest</LangVersion>
66
<Nullable>enable</Nullable>
77
<SignAssembly>True</SignAssembly>
88
<AssemblyOriginatorKeyFile>..\ArrayToPdf.snk</AssemblyOriginatorKeyFile>
9-
<AssemblyVersion>2.0.5</AssemblyVersion>
10-
<FileVersion>2.0.5</FileVersion>
11-
<Version>2.0.5</Version>
9+
<AssemblyVersion>2.1.0</AssemblyVersion>
10+
<FileVersion>2.1.0</FileVersion>
11+
<Version>2.1.0</Version>
1212
<Company></Company>
1313
<Authors>Leonid Salavatov</Authors>
14-
<Copyright>Leonid Salavatov 2022</Copyright>
14+
<Copyright>Leonid Salavatov 2024</Copyright>
1515
<PackageId>ArrayToPdf</PackageId>
1616
<Product>ArrayToPdf</Product>
1717
<Title>ArrayToPdf</Title>
@@ -33,7 +33,7 @@
3333

3434
<ItemGroup Condition="'$(TargetFramework)' != 'net45'">
3535
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
36-
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
36+
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
3737
</ItemGroup>
3838

3939
</Project>

0 commit comments

Comments
 (0)