This constructor will initialize the members of DocumentWriterEmfPage as follows:
Member | Description |
---|---|
Type | DocumentWriterPageType.Emf |
EmfHandle | IntPtr.Zero |
Image | null |
AnnotationContainer | null |
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();
// To 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:\LEADTOOLS23\Resources\Images";
}