各种PDF转换问题(三).将AutoCAD图纸转为PDF文档

原创 2014年09月06日 16:17:29

        目前国内企业生产的自动化程度并不是很高,大多数都无法使用三维图直接进行加工生产,所以二维图对于大多数企业来说,仍然是最根本的生产依据。那么,在企业中,二维图转PDF就是一个很重要的小步骤,因为后续的打印以及企业之间的交流,都离不开由二维图转出来的PDF文档。

        在三维CAD设计软件中,二维图转PDF一般是一个软件的内置功能,所以这些软件一般都会直接提供一个API,来实现转PDF的功能。如PROE的TOOLKIT库,NX的NXOpen库(注意不是C库,而是C++库。NX的C库中似乎是没有转PDF的功能的)。但是AutoCAD这个大名鼎鼎,领导世界二维图设计标准的软件,却没有内置的一个转PDF功能。

        早期版本的AutoCAD本身是完全不支持PDF转换的,那时候若要实现DWG图纸转PDF,要么使用第三方的库OpenDWG(早期名叫DWG DirectX)转PDF,要么就使用Adobe Acrobat打印机将图纸打印成PDF。后来AutoCAD终于内置了……一个将图纸打印成PDF的打印机。OpenDWG库转PDF以及Acrobat打印机打印PDF我都没研究过,我主要用的是AutoCAD自带的DWG TO PDF打印机。

        使用DWG TO PDF打印机打印图纸,大致有两种方式:基于AutoCAD COM库的调用(C++中使用ObjectARX来做这个事情我没研究过)和基于AutoCAD .NET库的调用。

        COM库:

        /// <summary>
        /// 通过自定义打印参数获取ACAD内部打印机对象参数
        /// </summary>
        /// <param name="document">图纸对象</param>
        /// <param name="plotSetting">自定义打印参数</param>
        /// <returns>内置打印机参数</returns>
        public static AcadPlotConfiguration getPlotConfiguration(AcadDocument document, PlotSetting plotSetting)
        {
            PageSize pageSize = plotSetting.PageSize;
            AcadPlotConfiguration plotConfiguration = document.PlotConfigurations.Add(Guid.NewGuid().ToString("N"), document.ActiveLayout.ModelType);
            plotConfiguration.ConfigName = plotSetting.Printer; //打印机名
            plotConfiguration.StyleSheet = plotSetting.StyleSheet; //样式表名
            plotConfiguration.PlotWithLineweights = true; //线宽比例
            plotConfiguration.PlotWithPlotStyles = true; //使用样式
            plotConfiguration.CanonicalMediaName = pageSize.Name; //图纸尺寸
            double[] LowerLeft = document.Utility.TranslateCoordinates(new double[] { pageSize.LowerLeftX, pageSize.LowerLeftY, 0 }, AcCoordinateSystem.acWorld, AcCoordinateSystem.acDisplayDCS, 0, Type.Missing) as double[];
            double[] UpperRight = document.Utility.TranslateCoordinates(new double[] { pageSize.UpperRightX, pageSize.UpperRightY, 0 }, AcCoordinateSystem.acWorld, AcCoordinateSystem.acDisplayDCS, 0, Type.Missing) as double[];
            plotConfiguration.SetWindowToPlot(new double[] { LowerLeft[0], LowerLeft[1] }, new double[] { UpperRight[0], UpperRight[1] });
            plotConfiguration.PlotType = AcPlotType.acWindow; //打印模式
            plotConfiguration.StandardScale = AcPlotScale.acScaleToFit; //标准比例,需要UseStandardScale = true;
            plotConfiguration.UseStandardScale = true;
            //configuration.UseStandardScale = false;
            //configuration.SetCustomScale(1, 30);
            plotConfiguration.CenterPlot = true; //居中打印
            plotConfiguration.PaperUnits = AcPlotPaperUnits.acMillimeters; //单位毫米
            plotConfiguration.PlotRotation = (pageSize.Rotation ? AcPlotRotation.ac90degrees : AcPlotRotation.ac0degrees);//横向纵向
            //plotConfiguration.PlotHidden = false;   //隐藏图元
            return plotConfiguration;
        }

        /// <summary>
        /// 打印图纸的模型空间到PDF文件
        /// </summary>
        /// <param name="document">图纸对象</param>
        /// <param name="plotSetting">PDF打印机设置</param>
        public static void goPlotting(AcadDocument document, PlotSetting plotSetting)
        {
            if (AcActiveSpace.acPaperSpace == document.ActiveSpace)
            {
                document.MSpace = true;
                document.ActiveSpace = AcActiveSpace.acModelSpace;
            }
            document.Regen(AcRegenType.acAllViewports);
            object oIsBackground = document.GetVariable("BACKGROUNDPLOT");
            AcadPlotConfiguration plotConfiguration = getPlotConfiguration(document, plotSetting);
            AcadLayout layout = document.ActiveLayout;
            layout.CopyFrom(plotConfiguration);
            layout.RefreshPlotDeviceInfo();
            document.SetVariable("BACKGROUNDPLOT", 0);//前台打印
            document.Plot.QuietErrorMode = true;
            document.Plot.NumberOfCopies = 1;
            document.Plot.PlotToFile(plotSetting.TargetFile, plotSetting.Printer);
            plotConfiguration.Delete();
            document.SetVariable("BACKGROUNDPLOT", oIsBackground);
        }

.net库:

        public static void goPlotting(PlotEngine engine, PlotInfo plotInfo, PlotPageInfo pageInfo, string sName, string sFile)
        {
            PlotInfoValidator validator = new PlotInfoValidator();
            validator.MediaMatchingPolicy = MatchingPolicy.MatchEnabled;
            validator.Validate(plotInfo);
            engine.BeginPlot(null, null);
            engine.BeginDocument(plotInfo, sName, null, 1, true, sFile);
            engine.BeginPage(pageInfo, plotInfo, true, null);
            engine.BeginGenerateGraphics(null);
            engine.EndGenerateGraphics(null);
            engine.EndPage(null);
            engine.EndDocument(null);
            engine.EndPlot(null);
        }

COM库的特点,主要是可以用一个外部程序来启动并操作AutoCAD,便于和其它软件集成;而.NET库的特点,主要是它有事务之类的东西,相对COM库,某些操作(比如遍历模型库)会快很多,只可惜它一般只能在AutoCAD内部进程使用。

(比如C#)里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件

因为有人问到,所以写了个例子。具体的要求是从.NET(比如C#)里面调用AutoCAD ActiveX API实现后台打印DWG文件为PDF文件,而且要把打印页面的大小设置成和DWG视图的页面的大小一...
  • mywaster
  • mywaster
  • 2015-12-08 20:52:45
  • 3414

使用ar.Net API进行CAD打印注意问题

StringCollection devlist = psVdr.GetPlotDeviceList();                 psVdr.SetPlotConfigurationNam...
  • xuhaiyan8825
  • xuhaiyan8825
  • 2012-10-30 21:26:24
  • 2215

PlotToDevice样例程序

Imports ZWCAD  Public Class Form1  Private Sub Button1_Click(ByVal sender As System.Object...
  • jingxuan84
  • jingxuan84
  • 2013-04-16 11:38:29
  • 1479

将AutoCAD的dwg图纸转换为pdf

在三维CAD设计软件中,二维图转PDF一般是一个软件的内置功能,所以这些软件一般都会直接提供一个API,来实现转PDF的功能。如PROE的TOOLKIT库,NX的NXOpen库(注意不是C库,而是C+...
  • Larry_666
  • Larry_666
  • 2018-03-19 09:06:47
  • 52

分享四种将PDF文件转换为CAD文件的方法,总有一个方法适合你

有时候我们会遇到一些设计图是以PDF文件形式显示的,那我们要怎么样将这种类型的PDF图纸转换成dwg或dxf格式呢? 如今网上的转换方法特别多,今天小编就给大家盘点一下将PDF文件转换成CAD图纸的...
  • qq_40427481
  • qq_40427481
  • 2017-10-12 17:29:51
  • 923

各种PDF转换问题(三).将AutoCAD图纸转为PDF文档

目前国内企业生产的自动化程度并不是很高,大多数都无法使用三维图直接进行加工生产,所以二维图对于大多数企业来说,仍然是最根本的生产依据。那么,在企业中,二维图转PDF就是一个很重要的小步骤,因为后续的打...
  • super_admi
  • super_admi
  • 2014-09-06 16:17:29
  • 6244

Plotting a window from AutoCAD using .NET

This post extends this previous post that dealt with driving a single-sheet AutoCAD plot by adding s...
  • sdphg
  • sdphg
  • 2007-10-15 14:10:00
  • 1480

20行Python代码教你批量将PDF文件转为Word格式

原文链接:点击打开链接摘要: 很多时候在学习时发现许多文档都是PDF格式,PDF格式却不利于学习使用,因此需要将PDF转换为Word文件,但或许你从网上下载了很多软件,但只能转换前五页(如WPS等),...
  • qq_40954115
  • qq_40954115
  • 2018-02-26 17:03:03
  • 136

AUTOCAD的DWG图纸怎么转换成PDF文件

我们用AUTOCAD绘图的时候经常要发PDF格式的图纸给客户,而不是发DWG的。那么我们怎么方便的将CAD文件转换成PDF文件了。      下面我教大家一招,借助PDF虚拟打印机和CAD的打印...
  • yiyihuazi
  • yiyihuazi
  • 2017-06-07 15:18:11
  • 1502

Driving a multi-sheet AutoCAD plot using .NET

Somewhat symmetrically I’m posting this from Chicago airport, once again, but thankfully I’m now on ...
  • sdphg
  • sdphg
  • 2007-10-15 14:01:00
  • 1256
收藏助手
不良信息举报
您举报文章:各种PDF转换问题(三).将AutoCAD图纸转为PDF文档
举报原因:
原因补充:

(最多只允许输入30个字)