Example
This example will create EMF handles and then use them to create a multipage PDF document.
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Document.Writer;
using Leadtools.Ocr;
public void DocumentEmfPageExample()
{
// Output PDF file name
var pdfFileName = Path.Combine(LEAD_VARS.ImagesDir, "Example.pdf");
// Document properties, each page is 8.5 by 11 inches at 300 DPI. Typical dimensions
var resolution = 300;
var pageWidth = (int)(8.5 * resolution);
var pageHeight = (int)(11 * resolution);
// Create the document writer
var docWriter = new DocumentWriter();
docWriter.BeginDocument(pdfFileName, DocumentFormat.Pdf);
for (var pageNumber = 1; pageNumber <= 2; pageNumber++)
{
var page = new DocumentWriterEmfPage();
page.EmfHandle = GetPageEmf(pageNumber, pageWidth, pageHeight, resolution);
docWriter.AddPage(page);
if (page.EmfHandle != IntPtr.Zero)
DeleteEnhMetaFile(page.EmfHandle);
}
docWriter.EndDocument();
// Show the PDF file
System.Diagnostics.Process.Start(pdfFileName);
}
private static IntPtr GetPageEmf(int pageNumber, int pageWidth, int pageHeight, int resolution)
{
// Get the screen DC
using (var graphicsScreen = Graphics.FromHwndInternal(IntPtr.Zero))
{
var hdcScreen = graphicsScreen.GetHdc();
// Calculate the EMF rectangle in 1/100 mm
var frameRect = new RectangleF(
0,
0,
((float)pageWidth * 2540 + resolution / 2) / resolution,
((float)pageHeight * 2540 + resolution / 2) / resolution);
// Create the EMF, GDI compatible
using (var metaFile = new Metafile(hdcScreen, frameRect, MetafileFrameUnit.GdiCompatible, EmfType.EmfOnly, null))
{
// No need for this anymore
graphicsScreen.ReleaseHdc(hdcScreen);
// Now create the graphics to draw in from the metafile
using (var graphics = Graphics.FromImage(metaFile))
{
// Get the EMF DPI
MetafileHeader header = metaFile.GetMetafileHeader();
var emfDpiX = header.DpiX;
var emfDpiY = header.DpiY;
// We must convert each value we want from pixels to EMF coordinates, so use a scale
graphics.ScaleTransform(emfDpiX / resolution, emfDpiY / resolution);
// To draw font, we must use this scale value to convert from point size
var fontScale = (float)resolution / Math.Max(graphics.DpiX, graphics.DpiY);
// Ready, now we can draw...
// Fill it with white
var rc = new RectangleF(0, 0, pageWidth, pageHeight);
graphics.FillRectangle(Brushes.White, rc);
// Put a frame
rc = new RectangleF(1, 1, pageWidth - 2, pageHeight - 2);
graphics.DrawRectangle(Pens.DarkGreen, rc.X, rc.Y, rc.Width, rc.Height);
// Draw some text
var text = "This is page " + pageNumber.ToString();
float pointSize = 20 * fontScale;
// fonts need to converted to scaled back, so ...
using (var font = new Font("Arial", pointSize, FontStyle.Regular))
graphics.DrawString(text, font, Brushes.Black, 0, 0);
// Add some vector objects, red line
rc = new Rectangle(50, 50, pageWidth - 100, pageHeight - 100);
graphics.DrawLine(Pens.Red, rc.Left, rc.Top, rc.Right, rc.Bottom);
// blue rect somewhere
rc = new Rectangle(100, 100, 150, 100);
graphics.FillRectangle(Brushes.Blue, rc);
}
return metaFile.GetHenhmetafile();
}
}
}
// GDI interop
[DllImport("gdi32.dll")]
private static extern int DeleteEnhMetaFile(IntPtr hemf);
static class LEAD_VARS
{
public const string ImagesDir = @"C:\LEADTOOLS21\Resources\Images";
}
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Document.Writer
Imports Leadtools.Ocr
Public Sub DocumentEmfPageExample()
' Output PDF file name
Dim pdfFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "Example.pdf")
' Document properties, each page is 8.5 by 11 inches at 300 DPI. Typical dimensions
Dim resolution As Integer = 300
Dim pageWidth As Integer = CInt(8.5 * resolution)
Dim pageHeight As Integer = CInt(11 * resolution)
' Create the document writer
Dim docWriter As New DocumentWriter()
docWriter.BeginDocument(pdfFileName, DocumentFormat.Pdf)
For pageNumber As Integer = 1 To 2
Dim page As New DocumentWriterEmfPage()
page.EmfHandle = GetPageEmf(pageNumber, pageWidth, pageHeight, resolution)
docWriter.AddPage(page)
If page.EmfHandle <> IntPtr.Zero Then
DeleteEnhMetaFile(page.EmfHandle)
End If
Next
docWriter.EndDocument()
' Show the PDF file
System.Diagnostics.Process.Start(pdfFileName)
End Sub
Private Shared Function GetPageEmf(pageNumber As Integer, pageWidth As Integer, pageHeight As Integer, resolution As Integer) As IntPtr
' Get the screen DC
Using graphicsScreen As Graphics = Graphics.FromHwndInternal(IntPtr.Zero)
Dim hdcScreen As IntPtr = graphicsScreen.GetHdc()
' Calculate the EMF rectangle in 1/100 mm
Dim frameRect As New RectangleF(
0,
0,
CType((pageWidth * 2540.0F + resolution / 2.0) / resolution, Single),
CType((pageHeight * 2540.0F + resolution / 2.0) / resolution, Single))
' Create the EMF, GDI compatible
Using metaFile As New Metafile(hdcScreen, frameRect, MetafileFrameUnit.GdiCompatible, EmfType.EmfOnly, Nothing)
' No need for this anymore
graphicsScreen.ReleaseHdc(hdcScreen)
' Now create the graphics to draw in from the metafile
Using graphics As Graphics = graphics.FromImage(metaFile)
' Get the EMF DPI
Dim header As MetafileHeader = metaFile.GetMetafileHeader()
Dim emfDpiX As Single = header.DpiX
Dim emfDpiY As Single = header.DpiY
' We must convert each value we want from pixels to EMF coordinates, so use a scale
graphics.ScaleTransform(emfDpiX / resolution, emfDpiY / resolution)
' To draw font, we must use this scale value to convert from point size
Dim fontScale As Single = CType(resolution, Single) / Math.Max(graphics.DpiX, graphics.DpiY)
' Ready, now we can draw...
' Fill it with white
Dim rc As New RectangleF(0, 0, pageWidth, pageHeight)
graphics.FillRectangle(Brushes.White, rc)
' Put a frame
rc = New RectangleF(1, 1, pageWidth - 2, pageHeight - 2)
graphics.DrawRectangle(Pens.DarkGreen, rc.X, rc.Y, rc.Width, rc.Height)
' Draw some text
Dim text As String = "This is page " + pageNumber.ToString()
Dim pointSize As Single = 20 * fontScale
' fonts need to converted to scaled back, so ...
Using font As New Font("Arial", pointSize, FontStyle.Regular)
graphics.DrawString(text, font, Brushes.Black, 0, 0)
End Using
' Add some vector objects, red line
rc = New Rectangle(50, 50, pageWidth - 100, pageHeight - 100)
graphics.DrawLine(Pens.Red, rc.Left, rc.Top, rc.Right, rc.Bottom)
' blue rect somewhere
rc = New Rectangle(100, 100, 150, 100)
graphics.FillRectangle(Brushes.Blue, rc)
End Using
Return metaFile.GetHenhmetafile()
End Using
End Using
End Function
' GDI interop
<DllImport("gdi32.dll")>
Private Shared Function DeleteEnhMetaFile(hemf As IntPtr) As Integer
End Function
Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\LEADTOOLS21\Resources\Images"
End Class