The DocumentWriterEmfPage class derives from DocumentWriterPage and contains the data for one EMF page to be added to a document file. It is used as a parameter to the DocumentWriter.AddPage or DocumentWriter.InsertPage methods used to add the page.
The DocumentWriterEmfPage.EmfHandle property must contain a valid Windows Enhanced Meta File handle (EMF) that contains the visual representation of the page. This EMF handle can obtained through multiple sources as explained in LEADTOOLS Document Writers.
DocumentWriterEmfPage.EmfHandle is used as is when DocumentWriter.AddPage or DocumentWriter.InsertPage is called and the framework does not delete it. You must use the Windows API DeleteEnhMetaFile to delete the object when it is no longer used.
The DocumentWriterEmfPage.Image property is optional and is used only when the document being created is PDF with the Image/Text overlay option. To create a PDF document with image/text overlay, perform the following steps:
The Dots/Inch (DPI) of the page is the same as the DPI stored in the DocumentWriterEmfPage.EmfHandle property. Therefore, to create a page with 300 DPI, you must add a document page with an EMF that has a DPI of 300 (both horizontally or vertically although the LEADTOOLS Document Writer supports different values for the DPI). If you are using the PDF with image/text feature, you must set the DPI of the RasterImage object to the same DPI as the EMF handle using the RasterImage.XResolution and RasterImage.YResolution properties. To override this behavior and set a custom resolution, set the value of the DocumentOptions.DocumentResolution property to the desired final resolution. This value will be used instead of the resolution of the EMF handle.
The LEADTOOLS Document Writer supports creating documents with zero or more empty pages inside them. Use DocumentWriter.AddPage or DocumentWriter.InsertPage an DocumentWriterEmptyPage with the dimension of the empty page set before hand in the DocumentOptions.EmptyPageWidth and DocumentOptions.EmptyPageHeight and its resolution set to DocumentOptions.EmptyPageResolution. As many empty pages as desired can be added in any index desired. To use empty pages, make sure the DocumentOptions.PageRestriction property is set to DocumentPageRestriction.Relaxed.
For more information, refer to PdfDocumentOptions.
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 namevar pdfFileName = Path.Combine(LEAD_VARS.ImagesDir, "Example.pdf");// Document properties, each page is 8.5 by 11 inches at 300 DPI. Typical dimensionsvar resolution = 300;var pageWidth = (int)(8.5 * resolution);var pageHeight = (int)(11 * resolution);// Create the document writervar 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 DCusing (var graphicsScreen = Graphics.FromHwndInternal(IntPtr.Zero)){var hdcScreen = graphicsScreen.GetHdc();// Calculate the EMF rectangle in 1/100 mmvar frameRect = new RectangleF(0,0,((float)pageWidth * 2540 + resolution / 2) / resolution,((float)pageHeight * 2540 + resolution / 2) / resolution);// Create the EMF, GDI compatibleusing (var metaFile = new Metafile(hdcScreen, frameRect, MetafileFrameUnit.GdiCompatible, EmfType.EmfOnly, null)){// No need for this anymoregraphicsScreen.ReleaseHdc(hdcScreen);// Now create the graphics to draw in from the metafileusing (var graphics = Graphics.FromImage(metaFile)){// Get the EMF DPIMetafileHeader 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 scalegraphics.ScaleTransform(emfDpiX / resolution, emfDpiY / resolution);// To draw font, we must use this scale value to convert from point sizevar fontScale = (float)resolution / Math.Max(graphics.DpiX, graphics.DpiY);// Ready, now we can draw...// Fill it with whitevar rc = new RectangleF(0, 0, pageWidth, pageHeight);graphics.FillRectangle(Brushes.White, rc);// Put a framerc = new RectangleF(1, 1, pageWidth - 2, pageHeight - 2);graphics.DrawRectangle(Pens.DarkGreen, rc.X, rc.Y, rc.Width, rc.Height);// Draw some textvar 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 linerc = new Rectangle(50, 50, pageWidth - 100, pageHeight - 100);graphics.DrawLine(Pens.Red, rc.Left, rc.Top, rc.Right, rc.Bottom);// blue rect somewhererc = 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:\LEADTOOLS22\Resources\Images";}