1+ using System . Runtime . InteropServices ;
2+ using PdfSharp ;
3+ using PdfSharp . Drawing ;
4+ using TheArtOfDev . HtmlRenderer . Core . Entities ;
5+ using TheArtOfDev . HtmlRenderer . Demo . Common ;
6+ using TheArtOfDev . HtmlRenderer . PdfSharp ;
7+
8+ namespace HtmlRenderer . PdfSharp . Test ;
9+
10+ [ TestClass ]
11+ public sealed class PdfGeneratorTests
12+ {
13+ [ TestMethod ]
14+ public void GeneratePdf_FromHtml_CreatesPdfDocument ( )
15+ {
16+ // Arrange
17+ var config = new PdfGenerateConfig
18+ {
19+ PageSize = PageSize . A4
20+ } ;
21+ config . SetMargins ( 20 ) ;
22+
23+ const string html = """
24+ <html>
25+ <head>
26+ <link rel="Stylesheet" href="StyleSheet" />
27+ </head>
28+ <body>
29+ <h1>PdfSharp</h1>
30+ <p>This is html rendered text <img src="ImageIcon" /></p>
31+ </body>
32+ </html>
33+ """ ;
34+
35+ // Act
36+ using var document = PdfGenerator . GeneratePdf ( html , config , null , DemoUtils . OnStylesheetLoad , OnImageLoadPdfSharp ) ;
37+
38+ // Assert
39+ Assert . AreEqual ( 1 , document . Pages . Count ) ;
40+
41+ using var stream = new MemoryStream ( ) ;
42+ document . Save ( stream , false ) ;
43+
44+ var pdf = stream . ToArray ( ) ;
45+ Assert . IsGreaterThan ( 4 , pdf . Length ) ;
46+ Assert . AreEqual ( "%PDF" , System . Text . Encoding . ASCII . GetString ( pdf , 0 , 4 ) ) ;
47+
48+ var pdfOutputDirectory = Environment . GetEnvironmentVariable ( "PDF_OUTPUT_DIRECTORY" ) ;
49+ if ( string . IsNullOrWhiteSpace ( pdfOutputDirectory ) )
50+ {
51+ pdfOutputDirectory = Path . Combine ( Path . GetTempPath ( ) , "html-renderer-pdf-artifacts" ) ;
52+ }
53+
54+ Directory . CreateDirectory ( pdfOutputDirectory ) ;
55+
56+ var pdfPath = Path . Combine (
57+ pdfOutputDirectory ,
58+ $ "{ nameof ( GeneratePdf_FromHtml_CreatesPdfDocument ) } -{ GetPlatformName ( ) } .pdf") ;
59+ File . WriteAllBytes ( pdfPath , pdf ) ;
60+ }
61+
62+ [ TestMethod ]
63+ public void GeneratePdf_FromHtml_WithMultipleFonts_CreatesPdfDocument ( )
64+ {
65+ // Arrange
66+ var config = new PdfGenerateConfig
67+ {
68+ PageSize = PageSize . A4
69+ } ;
70+ config . SetMargins ( 20 ) ;
71+
72+ const string html = """
73+ <html>
74+ <head>
75+ <link rel="Stylesheet" href="StyleSheet" />
76+ <style>
77+ .helvetica { font-family: Helvetica; }
78+ .mono { font-family: monospace; }
79+ </style>
80+ </head>
81+ <body>
82+ <p class="helvetica">Helvetica text</p>
83+ <p class="mono">Monospace text</p>
84+ </body>
85+ </html>
86+ """ ;
87+
88+ // Act
89+ using var document = PdfGenerator . GeneratePdf ( html , config , null , DemoUtils . OnStylesheetLoad , null ) ;
90+
91+ // Assert
92+ Assert . AreEqual ( 1 , document . Pages . Count ) ;
93+
94+ using var stream = new MemoryStream ( ) ;
95+ document . Save ( stream , false ) ;
96+
97+ var pdf = stream . ToArray ( ) ;
98+ Assert . IsGreaterThan ( 4 , pdf . Length ) ;
99+ Assert . AreEqual ( "%PDF" , System . Text . Encoding . ASCII . GetString ( pdf , 0 , 4 ) ) ;
100+
101+ var pdfOutputDirectory = Environment . GetEnvironmentVariable ( "PDF_OUTPUT_DIRECTORY" ) ;
102+ if ( string . IsNullOrWhiteSpace ( pdfOutputDirectory ) )
103+ {
104+ pdfOutputDirectory = Path . Combine ( Path . GetTempPath ( ) , "html-renderer-pdf-artifacts" ) ;
105+ }
106+
107+ Directory . CreateDirectory ( pdfOutputDirectory ) ;
108+
109+ var pdfPath = Path . Combine (
110+ pdfOutputDirectory ,
111+ $ "{ nameof ( GeneratePdf_FromHtml_WithMultipleFonts_CreatesPdfDocument ) } -{ GetPlatformName ( ) } .pdf") ;
112+ File . WriteAllBytes ( pdfPath , pdf ) ;
113+ }
114+
115+ private static void OnImageLoadPdfSharp ( object ? sender , HtmlImageLoadEventArgs e )
116+ {
117+ if ( ! string . Equals ( e . Src , "ImageIcon" , StringComparison . OrdinalIgnoreCase ) )
118+ {
119+ return ;
120+ }
121+
122+ using var imageStream = DemoUtils . GetImageStream ( e . Src ) ;
123+ if ( imageStream == null )
124+ {
125+ throw new InvalidOperationException ( "Expected demo image resource was not found." ) ;
126+ }
127+
128+ e . Callback ( XImage . FromStream ( imageStream ) ) ;
129+ }
130+
131+ private static string GetPlatformName ( )
132+ {
133+ if ( OperatingSystem . IsWindows ( ) )
134+ {
135+ return "windows" ;
136+ }
137+
138+ if ( OperatingSystem . IsMacOS ( ) )
139+ {
140+ return "macos" ;
141+ }
142+
143+ if ( OperatingSystem . IsLinux ( ) )
144+ {
145+ return "linux" ;
146+ }
147+
148+ return RuntimeInformation . RuntimeIdentifier ;
149+ }
150+ }
0 commit comments