60000271 Using the Printer to export to raster and PDF/SVG/EMF/HPGL files

Article 60000271
Type HowTo
Product Engine
Version 6
Date Added 10/16/2007 12:00:00 AM
Fixed (10/16/2007 12:00:00 AM)
Submitted by

Summary

Using the Printer to export to raster JPG/BMP/TIF/GIF and PDF/SVG/EMF/HPGL files *** This article applies to version 6009 beta6 (6009 release) and above ***

Solution

In version 6010 and above the vdPrinter object can be used to export the whole drawing or part of it to raster ( BMP JPG GIF TIF ) and PDF, SVG, HPGL and EMF files. Below is a sample code in C# that can be used for this:

private void button1_Click(object sender, EventArgs e)
{

// Except for EMF, the same can be done with PDF, BMP, JPG, SVG, HPG (HPGL)
// From version 6010 and above the printer can be used in order to export an area or the whole drawing in a
// raster format (BMP, JPG), PDF, SVG, or HGPL

#region create simple drawing
   //create a simple drawing
   vdFC.BaseControl.ActiveDocument.New();
    vdFC.BaseControl.ActiveDocument.CommandAction.CmdBox3d(new VectorDraw.Geometry.gPoint(10, 10), 10, 12, 14, 10);
    vdFC.BaseControl.ActiveDocument.CommandAction.CmdCircle(new VectorDraw.Geometry.gPoint(3, 3), 5.0d);
#endregion

#region save as EMF the Extends using fixed EMF width
   //save as EMF the Extends using fixed EMF width
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrinterName = "c:\\test_extends.emf"; // or PDF bmp jpg svg
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution=96; //Screen DPI
   VectorDraw.Geometry.Box Extends= vdFC.BaseControl.ActiveDocument.ActiveLayOut.Entities.GetBoundingBox(true,true);
   int EMFwidth = 500; //fixed width
   int EMFheight = (int) (EMFwidth * Extends.Height/Extends.Width); // keep propotions
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.paperSize = new Rectangle(0, 0, (int)(EMFwidth * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution), (int)(EMFheight * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution));
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintExtents();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintScaleToFit();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintOut();
#endregion

#region save as EMF the screen using fixed EMF height
   //save as EMF the screen using fixed EMF height
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrinterName = "c:\\test_screen.emf"; // or PDF bmp jpg svg
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution = 96; //Screen DPI
   VectorDraw.Geometry.Box screen_Box = new VectorDraw.Geometry.Box();
   double screen_width = vdFC.BaseControl.ActiveDocument.ActiveLayOut.PixelSize * vdFC.BaseControl.Width;
   double screen_height = vdFC.BaseControl.ActiveDocument.ActiveLayOut.ViewSize;
    screen_Box.AddPoint(vdFC.BaseControl.ActiveDocument.ActiveLayOut.ViewCenter - new VectorDraw.Geometry.gPoint(screen_width / 2.0d, screen_height / 2.0d));
    screen_Box.AddPoint(vdFC.BaseControl.ActiveDocument.ActiveLayOut.ViewCenter + new VectorDraw.Geometry.gPoint(screen_width / 2.0d, screen_height / 2.0d));
    EMFheight = 500; // this is fixed
   EMFwidth = (int)(EMFheight * screen_width / screen_height); //keeping the propotion
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.paperSize = new Rectangle(0, 0, (int)(EMFwidth * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution), (int)(EMFheight * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution));
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintWindow = screen_Box; // Here the code can be changed so
    // the user can select a rectangle in screen and this area is saved to file.
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintScaleToFit();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintOut();
#endregion

#region call the PrintPreview in order the user to select the area to export to file
   // call the PrintPreview in order the user to select the area to export to file
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrinterName = "*.emf"; // Using *.emf or *.pdf etc the print dialog will prompt a dialog to input the file name
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution = 96; //Screen DPI
   EMFwidth = 500; //fixed width
   EMFheight = 500; // and height
   vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.paperSize = new Rectangle(0, 0, (int)(EMFwidth * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution), (int)(EMFheight * 100 / vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.Resolution));
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintExtents();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.PrintScaleToFit();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.InitializePreviewFormProperties(true, true, false, false);
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.CenterDrawingToPaper();
    vdFC.BaseControl.ActiveDocument.ActiveLayOut.Printer.DialogPreview();
#endregion

}

 

 
Using the VDF Wrapper ActiveX (vdraw.ocx) and the VectorDraw.Geometry.tlb and VectorDraw.Professional.tlb, you can do the same with a code like:

Private Sub Command1_Click()
 Dim doc As VectorDraw_Professional.vdDocument
 Dim box As Variant
 Dim EMFwidth As Long 
 Dim EMFheight As Long
 Dim extends As New VectorDraw_Geometry.box

    Set doc = VDraw1.ActiveDocument.WrapperObject
    
    doc.ActiveLayOut.Printer.PrinterName = App.Path + "\10165.emf"
    doc.ActiveLayOut.Printer.Resolution = 96

    extends.AddBox doc.ActiveLayOut.entities.GetBoundingBox(True, False)
    extends.Transformby doc.World2ViewMatrix
    extends.AddWidth doc.ActiveLayOut.Render.PixelSize * CDbl(0.5)
    
    EMFwidth = 1000
    EMFheight = CLng(EMFwidth * extends.Height / extends.Width + 0.5)

    doc.ActiveLayOut.Printer.SelectPaper "CUSTOM"
    doc.ActiveLayOut.Printer.MARGINS.Top = 0
    doc.ActiveLayOut.Printer.MARGINS.Bottom = 0
    doc.ActiveLayOut.Printer.MARGINS.Left = 0
    doc.ActiveLayOut.Printer.MARGINS.Right = 0
    doc.ActionLayout.Printer.Update
    
    VDraw1.ActiveDocument.ActiveLayOut.Printer.ActivePaperWidth = CLng(100# * CDbl(EMFwidth)  / CDbl(doc.ActiveLayOut.Printer.Resolution))
    VDraw1.ActiveDocument.ActiveLayOut.Printer.ActivePaperHeight = CLng(100# * CDbl(EMFheight) / CDbl(doc.ActiveLayOut.Printer.Resolution))
    
    
    Set doc.ActiveLayOut.Printer.PrintWindow = extends
    doc.ActiveLayOut.Printer.PrintScaleToFit
    doc.ActiveLayOut.Printer.PrintOut
End Sub

Send comments on this topic.