Skip to content

Commit fb276e1

Browse files
committed
Initial commit
0 parents  commit fb276e1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+7555
-0
lines changed

.gitignore

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
src/DinkToPdf/bin/
2+
src/DinkToPdf/obj/
3+
src/DinkToPfd.ConsoleApp/obj/
4+
src/DinkToPfd.ConsoleApp/bin/
5+
src/DinkToPdf.ThreadSafe/bin/Debug/netcoreapp1.0/DinkToPdf.ThreadSafe.runtimeconfig.json
6+
src/DinkToPdf.ThreadSafe/bin/Release/PublishOutput/DinkToPdf.ThreadSafe.deps.json
7+
src/DinkToPdf.ThreadSafe/bin/
8+
src/DinkToPdf.ThreadSafe/Properties/
9+
src/DinkToPdf.ThreadSafe/Files/
10+
src/DinkToPdf.ThreadSafe/obj/

.vs/config/applicationhost.config

+1,020
Large diffs are not rendered by default.

.vs/restore.dg

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#:C:\Users\admin\Documents\DinkToPdf\src\DinkToPdf.ThreadSafe\DinkToPdf.ThreadSafe.xproj
2+
C:\Users\admin\Documents\DinkToPdf\src\DinkToPdf.ThreadSafe\DinkToPdf.ThreadSafe.xproj|C:\Users\admin\Documents\DinkToPdf\src\DinkToPdf\DinkToPdf.xproj

DinkToPdf.sln

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio 14
4+
VisualStudioVersion = 14.0.25420.1
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{96268FD4-5328-4959-8934-D5158ED9153D}"
7+
EndProject
8+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5C3B3252-A51E-4B1D-A3D1-43EB5A43A24B}"
9+
ProjectSection(SolutionItems) = preProject
10+
global.json = global.json
11+
EndProjectSection
12+
EndProject
13+
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "DinkToPdf", "src\DinkToPdf\DinkToPdf.xproj", "{311B868A-98AF-41F9-B4AB-7F13BEE651BE}"
14+
EndProject
15+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{A8053F96-6858-43CF-9819-379814C2F727}"
16+
EndProject
17+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{54EA27C3-173F-43E1-B8B3-134DA04982E7}"
18+
EndProject
19+
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "DinkToPdf.ConsoleApp", "src\DinkToPfd.ConsoleApp\DinkToPdf.ConsoleApp.xproj", "{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1}"
20+
EndProject
21+
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "DinkToPdf.ThreadSafe", "src\DinkToPdf.ThreadSafe\DinkToPdf.ThreadSafe.xproj", "{7AB977DC-E9BE-42FE-834E-0170CB8A845C}"
22+
EndProject
23+
Global
24+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
25+
Debug|Any CPU = Debug|Any CPU
26+
Release|Any CPU = Release|Any CPU
27+
EndGlobalSection
28+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
29+
{311B868A-98AF-41F9-B4AB-7F13BEE651BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30+
{311B868A-98AF-41F9-B4AB-7F13BEE651BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
31+
{311B868A-98AF-41F9-B4AB-7F13BEE651BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
32+
{311B868A-98AF-41F9-B4AB-7F13BEE651BE}.Release|Any CPU.Build.0 = Release|Any CPU
33+
{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
34+
{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
35+
{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
36+
{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1}.Release|Any CPU.Build.0 = Release|Any CPU
37+
{7AB977DC-E9BE-42FE-834E-0170CB8A845C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38+
{7AB977DC-E9BE-42FE-834E-0170CB8A845C}.Debug|Any CPU.Build.0 = Debug|Any CPU
39+
{7AB977DC-E9BE-42FE-834E-0170CB8A845C}.Release|Any CPU.ActiveCfg = Release|Any CPU
40+
{7AB977DC-E9BE-42FE-834E-0170CB8A845C}.Release|Any CPU.Build.0 = Release|Any CPU
41+
EndGlobalSection
42+
GlobalSection(SolutionProperties) = preSolution
43+
HideSolutionNode = FALSE
44+
EndGlobalSection
45+
GlobalSection(NestedProjects) = preSolution
46+
{311B868A-98AF-41F9-B4AB-7F13BEE651BE} = {96268FD4-5328-4959-8934-D5158ED9153D}
47+
{A8053F96-6858-43CF-9819-379814C2F727} = {96268FD4-5328-4959-8934-D5158ED9153D}
48+
{54EA27C3-173F-43E1-B8B3-134DA04982E7} = {96268FD4-5328-4959-8934-D5158ED9153D}
49+
{7370EBBF-F5E9-43BB-B987-44C2BAFFDBF1} = {54EA27C3-173F-43E1-B8B3-134DA04982E7}
50+
{7AB977DC-E9BE-42FE-834E-0170CB8A845C} = {54EA27C3-173F-43E1-B8B3-134DA04982E7}
51+
EndGlobalSection
52+
EndGlobal

global.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"projects": [ "src", "test" ],
3+
"sdk": {
4+
"version": "1.0.0-preview2-003131"
5+
}
6+
}

src/DinkToPdf/BasicConverter.cs

+232
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
using System.Threading.Tasks;
6+
using DinkToPdf.Contracts;
7+
using DinkToPdf.EventDefinitions;
8+
using System.Globalization;
9+
10+
namespace DinkToPdf
11+
{
12+
public class BasicConverter : IConverter
13+
{
14+
public readonly ITools Tools;
15+
16+
public IDocument ProcessingDocument { get; private set; }
17+
18+
public event EventHandler<PhaseChangedArgs> PhaseChanged;
19+
20+
public event EventHandler<ProgressChangedArgs> ProgressChanged;
21+
22+
public event EventHandler<FinishedArgs> Finished;
23+
24+
public event EventHandler<ErrorArgs> Error;
25+
26+
public event EventHandler<WarningArgs> Warning;
27+
28+
public BasicConverter(ITools tools) {
29+
Tools = tools;
30+
}
31+
32+
public virtual byte[] Convert(IDocument document)
33+
{
34+
if (document.GetObjects().Count() == 0)
35+
{
36+
throw new ArgumentException("No objects is defined in document that was passed. At least one object must be defined.");
37+
}
38+
39+
ProcessingDocument = document;
40+
41+
byte[] result = new byte[0];
42+
Tools.Load();
43+
44+
IntPtr converter = CreateConverter(document);
45+
46+
//register events
47+
Tools.SetPhaseChangedCallback(converter, OnPhaseChanged);
48+
Tools.SetProgressChangedCallback(converter, OnProgressChanged);
49+
Tools.SetFinishedCallback(converter, OnFinished);
50+
Tools.SetWarningCallback(converter, OnWarning);
51+
Tools.SetErrorCallback(converter, OnError);
52+
53+
bool converted = Tools.DoConversion(converter);
54+
55+
if (converted)
56+
{
57+
result = Tools.GetConversionResult(converter);
58+
}
59+
60+
Tools.DestroyConverter(converter);
61+
62+
return result;
63+
}
64+
65+
private void OnPhaseChanged(IntPtr converter)
66+
{
67+
int currentPhase = Tools.GetCurrentPhase(converter);
68+
var eventArgs = new PhaseChangedArgs()
69+
{
70+
Document = ProcessingDocument,
71+
PhaseCount = Tools.GetPhaseCount(converter),
72+
CurrentPhase = currentPhase,
73+
Description = Tools.GetPhaseDescription(converter, currentPhase)
74+
};
75+
76+
PhaseChanged?.Invoke(this, eventArgs);
77+
}
78+
79+
private void OnProgressChanged(IntPtr converter)
80+
{
81+
var eventArgs = new ProgressChangedArgs()
82+
{
83+
Document = ProcessingDocument,
84+
Description = Tools.GetProgressString(converter)
85+
};
86+
87+
ProgressChanged?.Invoke(this, eventArgs);
88+
}
89+
90+
private void OnFinished(IntPtr converter, int success)
91+
{
92+
var eventArgs = new FinishedArgs()
93+
{
94+
Document = ProcessingDocument,
95+
Success = success == 1 ? true : false
96+
};
97+
98+
Finished?.Invoke(this, eventArgs);
99+
}
100+
101+
private void OnError(IntPtr converter, string message)
102+
{
103+
var eventArgs = new ErrorArgs()
104+
{
105+
Document = ProcessingDocument,
106+
Message = message
107+
};
108+
109+
Error?.Invoke(this, eventArgs);
110+
}
111+
112+
private void OnWarning(IntPtr converter, string message)
113+
{
114+
var eventArgs = new WarningArgs()
115+
{
116+
Document = ProcessingDocument,
117+
Message = message
118+
};
119+
120+
Warning?.Invoke(this, eventArgs);
121+
}
122+
123+
private IntPtr CreateConverter(IDocument document) {
124+
125+
IntPtr converter = IntPtr.Zero;
126+
127+
{
128+
IntPtr settings = Tools.CreateGlobalSettings();
129+
130+
ApplyConfig(settings, document, true);
131+
132+
converter = Tools.CreateConverter(settings);
133+
}
134+
135+
foreach (var obj in document.GetObjects())
136+
{
137+
if (obj != null)
138+
{
139+
IntPtr settings = Tools.CreateObjectSettings();
140+
141+
ApplyConfig(settings, obj, false);
142+
143+
Tools.AddObject(converter, settings, obj.GetContent());
144+
}
145+
}
146+
147+
return converter;
148+
}
149+
150+
private void ApplyConfig(IntPtr config, ISettings settings, bool isGlobal) {
151+
152+
if (settings == null)
153+
{
154+
return;
155+
}
156+
157+
var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
158+
159+
var props = settings.GetType().GetProperties(bindingFlags);
160+
161+
foreach (var prop in props)
162+
{
163+
Attribute[] attrs = (Attribute[])prop.GetCustomAttributes();
164+
object propValue = prop.GetValue(settings);
165+
166+
if (propValue == null)
167+
{
168+
continue;
169+
}
170+
else if (attrs.Length > 0 && attrs[0] is WkHtmlAttribute)
171+
{
172+
var attr = attrs[0] as WkHtmlAttribute;
173+
174+
Apply(config, attr.Name, propValue, isGlobal);
175+
}
176+
else if (propValue is ISettings)
177+
{
178+
ApplyConfig(config, propValue as ISettings, isGlobal);
179+
}
180+
181+
}
182+
}
183+
184+
private void Apply(IntPtr config, string name, object value, bool isGlobal)
185+
{
186+
var type = value.GetType();
187+
188+
Func<IntPtr, string, string, int> applySetting;
189+
if (isGlobal)
190+
{
191+
applySetting = Tools.SetGlobalSetting;
192+
}
193+
else
194+
{
195+
applySetting = Tools.SetObjectSetting;
196+
}
197+
198+
if (typeof(bool) == type)
199+
{
200+
applySetting(config, name, ((bool)value == true ? "true" : "false"));
201+
}
202+
else if (typeof(double) == type)
203+
{
204+
applySetting(config, name, ((double)value).ToString("0.##", CultureInfo.InvariantCulture));
205+
}
206+
else if (typeof(Dictionary<string, string>).IsAssignableFrom(type))
207+
{
208+
var dictionary = (Dictionary<string, string>)value;
209+
int index = 0;
210+
211+
foreach (var pair in dictionary)
212+
{
213+
if (pair.Key == null || pair.Value == null)
214+
{
215+
continue;
216+
}
217+
218+
//https://github.com/wkhtmltopdf/wkhtmltopdf/blob/c754e38b074a75a51327df36c4a53f8962020510/src/lib/reflect.hh#L192
219+
applySetting(config, name + ".append", null);
220+
applySetting(config, string.Format("{0}[{1}]", name, index), pair.Key + "\n" + pair.Value);
221+
222+
index++;
223+
}
224+
}
225+
else
226+
{
227+
applySetting(config, name, value.ToString());
228+
}
229+
230+
}
231+
}
232+
}

src/DinkToPdf/Contracts/IConverter.cs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using DinkToPdf.EventDefinitions;
6+
7+
namespace DinkToPdf.Contracts
8+
{
9+
public interface IConverter
10+
{
11+
12+
/// <summary>
13+
/// Converts document based on given settings
14+
/// </summary>
15+
/// <param name="document">Document to convert</param>
16+
/// <returns>Returns converted document in bytes</returns>
17+
byte[] Convert(IDocument document);
18+
19+
event EventHandler<PhaseChangedArgs> PhaseChanged;
20+
21+
event EventHandler<ProgressChangedArgs> ProgressChanged;
22+
23+
event EventHandler<FinishedArgs> Finished;
24+
25+
event EventHandler<ErrorArgs> Error;
26+
27+
event EventHandler<WarningArgs> Warning;
28+
29+
}
30+
}

src/DinkToPdf/Contracts/IDocument.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
6+
namespace DinkToPdf.Contracts
7+
{
8+
public interface IDocument : ISettings
9+
{
10+
IEnumerable<IObject> GetObjects();
11+
}
12+
}

src/DinkToPdf/Contracts/IObject.cs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace DinkToPdf.Contracts
6+
{
7+
public interface IObject : ISettings
8+
{
9+
byte[] GetContent();
10+
}
11+
}

src/DinkToPdf/Contracts/ISetting.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
6+
namespace DinkToPdf.Contracts
7+
{
8+
public interface ISettings
9+
{
10+
11+
}
12+
}

0 commit comments

Comments
 (0)