如何用.NET(CSharp & VB.NET)将DWG文件打印为PDF

因为有人问到,所以写了个例子。具体的要求是从.NET(比如C#)里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件,而且要把打印页面的大小设置成和DWG视图的页面的大小一致。当然除了ActiveX API,其它接口,比如ObjectARX和AutoCAD.NET API也支持打印并能实现上述功能的。不过我们今天就限定一下范围,用一用ActiveX API,而且指定产品是AutoCAD 2010吧。

执行步骤:打开一个dwg文件,用netload加载下面代码所在的.dll文件,再输入命令plottest,就得到输出结果(一个.pdf文件)。

要用到的参考:

AcDbMgd.dll;AcMgd.dll;AutoCAD 2010 Type Library;System.Windows.Forms; AutoCAD/ObjectDBX Common 18.0 Type Library.

VB.NET:

Imports System

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.Interop

Imports Autodesk.AutoCAD.Interop.Common

Imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AutoCAD.DatabaseServices

Imports Autodesk.AutoCAD.EditorInput

 

        <Autodesk.AutoCAD.Runtime.CommandMethod("Plottest")> _

        Public Sub PlotToPDF()

            Dim activeDoc As Document = Application.DocumentManager.MdiActiveDocument

            Dim ThisDrawing As AcadDocument = CType(activeDoc.AcadDocument, AcadDocument)

            Dim layout As AcadLayout = ThisDrawing.ActiveLayout

            Dim MediaName As String = layout.CanonicalMediaName

            If MediaName.Equals("") Then

                activeDoc.Editor.WriteMessage("There is no media set for the active layout.")

                Return

            Else

                activeDoc.Editor.WriteMessage(("The media for the active layout is: " + MediaName))

            End If

            Try

                Dim oplot As AcadPlotConfiguration = ThisDrawing.PlotConfigurations.Add("PDF", layout.ModelType)

                oplot.PaperUnits = AcPlotPaperUnits.acMillimeters

                oplot.StyleSheet = "monochrome.ctb"

                oplot.PlotWithPlotStyles = True

                oplot.ConfigName = "DWG To PDF.pc3"

                oplot.UseStandardScale = True

                oplot.StandardScale = AcPlotScale.acScaleToFit

                oplot.PlotType = AcPlotType.acExtents

                oplot.CenterPlot = True

                Dim oMediaNames As Object = layout.GetCanonicalMediaNames

                Dim mediaNames As ArrayList = New ArrayList(CType(oMediaNames, String()))

                For Each sName As String In mediaNames

                    If sName.Contains(MediaName) Then

                        oplot.CanonicalMediaName = sName

                        layout.CopyFrom(oplot)

                        layout.PlotRotation = AcPlotRotation.ac0degrees

                        layout.RefreshPlotDeviceInfo()

                        ThisDrawing.SetVariable("BACKGROUNDPLOT", 0)

                        ThisDrawing.Plot.QuietErrorMode = True

                        ThisDrawing.Plot.PlotToFile("c:/temp/d1.pdf", "DWG To PDF.pc3")

                        oplot.Delete()

                        oplot = Nothing

                        Return

                    End If

                Next

            Catch es As System.Exception

                System.Windows.Forms.MessageBox.Show(es.ToString)

            End Try

        End Sub 

 

C#:

using System;

using System.Collections;

using System.Collections.Specialized;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Interop;

using Autodesk.AutoCAD.Interop.Common;

 

        // Define Command "plotTest"

        [CommandMethod("plotTest")]

        static public void PlotToPDF()

        {

            Document activeDoc = Application.DocumentManager.MdiActiveDocument;

            AcadDocument ThisDrawing = activeDoc.AcadDocument as AcadDocument;

            AcadLayout layout = ThisDrawing.ActiveLayout;

 

            String MediaName = layout.CanonicalMediaName;

            if (MediaName.Equals(""))

            {

                activeDoc.Editor.WriteMessage("There is no media set for the active layout.");

                return;

            }

            else

            {

                activeDoc.Editor.WriteMessage("The media for the active layout is: " + MediaName);

            }

 

            try

           {

               AcadPlotConfiguration oplot = ThisDrawing.PlotConfigurations.Add("PDF", layout.ModelType);

               oplot.PaperUnits = AcPlotPaperUnits.acMillimeters;

               oplot.StyleSheet = "monochrome.ctb";

               oplot.PlotWithPlotStyles = true;

               oplot.ConfigName = "DWG To PDF.pc3";

               oplot.UseStandardScale = true;              

               oplot.StandardScale = AcPlotScale.acScaleToFit;

               oplot.PlotType = AcPlotType.acExtents;

               oplot.CenterPlot = true;

               

                Object oMediaNames = layout.GetCanonicalMediaNames();

 

                ArrayList mediaNames = new ArrayList((string[])oMediaNames);

 

                foreach (String sName in mediaNames)

                {

                    if (sName.Contains(MediaName))

                    {

                        oplot.CanonicalMediaName = sName;

                        layout.CopyFrom(oplot);

                        layout.PlotRotation = AcPlotRotation.ac0degrees;

                        layout.RefreshPlotDeviceInfo();

 

                        ThisDrawing.SetVariable("BACKGROUNDPLOT", 0);

                        ThisDrawing.Plot.QuietErrorMode = true;                    

 

                        ThisDrawing.Plot.PlotToFile("c://temp//d1.pdf","DWG To PDF.pc3");

                        oplot.Delete();

                        oplot=null;

                        return;

                    }

                }

            }

            catch (System.Exception es)

            {

                System.Windows.Forms.MessageBox.Show(es.ToString());

            }

        }

输出结果:

如何用.NET(CSharp & VB.NET)将DWG文件打印为PDF_第1张图片

这只是个例子。大家从中可以看到AutoCAD的打印定制程序可以是这样写的。但是实际需求是各种各样的,要具体分析情况并使用不同的方法。

你可能感兴趣的:(AutoCAD,.NET)