Intro
 

This example shows how to port System.Drawing code for output to PDF.

You may have System.Drawing code which writes output to the screen or an image or to a printer. You may wish to modify this code to write to a PDF. ABCpdf comes with wrapper code which can significantly ease this process.

You can find a full example project including the wrapper classes under the ABCpdf menu item.

 

   

Basics
 

The wrapper contains the following namespaces:

WebSupergoo.ABCpdf10.Drawing;
WebSupergoo.ABCpdf10.Drawing.Drawing2D;
WebSupergoo.ABCpdf10.Drawing.Text;

These contain classes which are direct analogues for the classes contained in the System.Drawing namespaces. For example, a System.Drawing.Pen maps to a WebSupergoo.ABCpdf10.Drawing.Pen and a System.Drawing.Bitmap maps to a WebSupergoo.ABCpdf10.Drawing.Bitmap.

The procedure for porting your System.Drawing code is simple:

  1. Change namespaces from those in System.Drawing to the corresponding ones in ABCpdf10.Drawing (Drawing, Drawing.Text, Drawing.Drawing2D etc.)
  2. Change all types from those in System.Drawing to the corresponding types in ABCpdf10.Drawing (Pen, Brush, Color etc.)
  3. Remove any code which does not have an analogues in ABCpdf.Drawing

In general, the number of calls which do not have analogues in ABCpdf.Drawing should be small. However, we provide the full source code for System.Drawing so extending the assembly is simple.

As well as the standard functions analogous to those in System.Drawing, the ABCpdf10.Drawing namespace also contains similar functions aimed at greater control over the PDF production process. For example, the ABCpdf Color class contains a FromCmyk function to allow the construction of CMYK colors as well as RGB ones.

 

   

Original
 

We start with our source System.Drawing code.

[C#]
using System;
using System.IO;
using System.Reflection;

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;

...

// create a canvas for painting on
Bitmap pg = new Bitmap((int)(8.5 * 72), (int)(11 * 72));
Graphics gr = Graphics.FromImage(pg);

// clear the canvas to white
Rectangle pgRect = new Rectangle(0, 0, pg.Width, pg.Height);
SolidBrush solidWhite = new SolidBrush(Color.White);
gr.FillRectangle(solidWhite, pgRect);
// load a new image and draw it centered on our canvas
Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("Examples.pic1.jpg");
Image img = Image.FromStream(stm);
int w = img.Width * 2;
int h = img.Height * 2;
Rectangle rc = new Rectangle((pg.Width - w) / 2, (pg.Height - h) / 2, w, h);
gr.DrawImage(img, rc);
img.Dispose();
stm.Close();
// frame the image with a black border
gr.DrawRectangle(new Pen(Color.Black, 4), rc);
// add some text at the top left of the canvas
Font fn = new Font("Comic Sans MS", 72);
SolidBrush solidBlack = new SolidBrush(Color.Black);
gr.DrawString("My Picture", fn, solidBlack, (int)(pg.Width * 0.1), (int)(pg.Height * 0.1));

// save the output
pg.Save("../../abcpdf.drawing.gif", System.Drawing.Imaging.ImageFormat.Gif);

[Visual Basic]
Imports System.IO
Imports System.Reflection

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Text

...

' create a canvas for painting on
Dim pg As Bitmap = New Bitmap(CType((8.5 * 72),(Integer)(11 * 72), Integer))
Dim gr As Graphics = Graphics.FromImage(pg)

' clear the canvas to white
Dim pgRect As Rectangle = New Rectangle(0,0,pg.Width,pg.Height)
Dim solidWhite As SolidBrush = New SolidBrush(Color.White)
gr.FillRectangle(solidWhite, pgRect)
' load a new image and draw it centered on our canvas
Dim stm As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Examples.pic1.jpg")
Dim img As Image = Image.FromStream(stm)
Dim w As Integer = img.Width * 2
Dim h As Integer = img.Height * 2
Dim rc As Rectangle = New Rectangle((pg.Width - w) / 2,(pg.Height - h) / 2,w,h)
gr.DrawImage(img, rc)
img.Dispose()
stm.Close()
' frame the image with a black border
gr.DrawRectangle(New Pen(Color.Black,4),rc)
' add some text at the top left of the canvas
Dim fn As Font = New Font("Comic Sans MS",72)
Dim solidBlack As SolidBrush = New SolidBrush(Color.Black)
gr.DrawString("My Picture", fn, solidBlack, CType((pg.Width * 0.1), (Integer)(pg.Height * 0.1), Integer))

' save the output
pg.Save("../../abcpdf.drawing.gif", System.Drawing.Imaging.ImageFormat.Gif)

 

   

Names
 

First, we swap out the old System.Drawing namespaces and insert our own ABCpdf.Drawing ones. Note that ABCpdf.Drawing uses structures like rectangles and points which are defined in System.Drawing. So, we create aliases to make it easy to reference them.

[C#]
using System;
using System.IO;
using System.Reflection;

using WebSupergoo.ABCpdf10.Drawing;
using WebSupergoo.ABCpdf10.Drawing.Drawing2D;
using WebSupergoo.ABCpdf10.Drawing.Text;
using Rectangle = System.Drawing.Rectangle;
using RectangleF = System.Drawing.RectangleF;
using Point = System.Drawing.Point;
using PointF = System.Drawing.PointF;

[Visual Basic]
Imports System
Imports System.IO
Imports System.Reflection

Imports WebSupergoo.ABCpdf10.Drawing
Imports WebSupergoo.ABCpdf10.Drawing.Drawing2D
Imports WebSupergoo.ABCpdf10.Drawing.Text
Imports Rectangle = System.Drawing.Rectangle
Imports RectangleF = System.Drawing.RectangleF
Imports Point = System.Drawing.Point
Imports PointF = System.Drawing.PointF

 

   

Create
 

Because we're drawing on a page of a PDF document rather than on an image, we need to make a few modifications to the first lines of code.

[C#]
// create a canvas for painting on
PDFDocument doc = new PDFDocument();
Page pg = doc.AddPage((int)(8.5 * 72), (int)(11 * 72));
Graphics gr = pg.Graphics;

[Visual Basic]
' create a canvas for painting on
Dim doc As PDFDocument = New PDFDocument()
Dim pg As Page = doc.AddPage(8.5 * 72, 11 * 72)
Dim gr As Graphics = pg.Graphics

 

   

Draw
 

The drawing code remains completely unchanged.

[C#]
// clear the canvas to white
Rectangle pgRect = new Rectangle(0, 0, pg.Width, pg.Height);
SolidBrush solidWhite = new SolidBrush(Color.White);
gr.FillRectangle(solidWhite, pgRect);
// load a new image and draw it centered on our canvas
Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("Examples.pic1.jpg");
Image img = Image.FromStream(stm);
int w = img.Width * 2;
int h = img.Height * 2;
Rectangle rc = new Rectangle((pg.Width - w) / 2, (pg.Height - h) / 2, w, h);
gr.DrawImage(img, rc);
img.Dispose();
stm.Close();
// frame the image with a black border
gr.DrawRectangle(new Pen(Color.Black, 4), rc);
// add some text at the top left of the canvas
Font fn = new Font("Comic Sans MS", 72);
SolidBrush solidBlack = new SolidBrush(Color.Black);
gr.DrawString("My Picture", fn, solidBlack, (int)(pg.Width * 0.1), (int)(pg.Height * 0.1));

[Visual Basic]
' clear the canvas to white
Dim pgRect As Rectangle = New Rectangle(0,0,pg.Width,pg.Height)
Dim solidWhite As SolidBrush = New SolidBrush(Color.White)
gr.FillRectangle(solidWhite, pgRect)
' load a new image and draw it centered on our canvas
Dim stm As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Examples.pic1.jpg")
Dim img As Image = Image.FromStream(stm)
Dim w As Integer = img.Width * 2
Dim h As Integer = img.Height * 2
Dim rc As Rectangle = New Rectangle((pg.Width - w) / 2,(pg.Height - h) / 2,w,h)
gr.DrawImage(img, rc)
img.Dispose()
stm.Close()
' frame the image with a black border
gr.DrawRectangle(New Pen(Color.Black,4),rc)
' add some text at the top left of the canvas
Dim fn As Font = New Font("Comic Sans MS",72)
Dim solidBlack As SolidBrush = New SolidBrush(Color.Black)
gr.DrawString("My Picture", fn, solidBlack, CType((pg.Width * 0.1), (Integer)(pg.Height * 0.1), Integer))

 

   

Save
 

Because we're saving to a PDF document, we need to make a few modifications to the last lines of code.

[C#]
// save the output
doc.Save(Server.MapPath("abcpdf.drawing.pdf"));

[Visual Basic]
' save the output
doc.Save(Server.MapPath("abcpdf.drawing.pdf"))

 

   

Results
 


abcpdf.drawing.png


abcpdf.drawing.pdf