明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10216|回复: 5

如何批量打印图纸?已解决!如何不打开图形打印?

[复制链接]
发表于 2009-10-2 15:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-10-9 14:07:23 编辑

有一个文件夹下1000张图,需要把他们用adobe pdf打印机打印到另外一个文件夹中,

打印范围是(0,0)(420,297),A3纸,横向打印,打印后pdf名字取dwg的名字,去掉dwg,改成pdf,如1.dwg,打印完了以后就是1.pdf。

主要是如何打印一张图纸,那么1000张也就好办了。最后能够不用打开图纸,用database读取dwg或dxf,然后打印。

PlottingServices里面的东西太多了,不知道怎么用。

谢谢!

下面的是VBA代码,不知道C#怎么用

Public Sub PlotWindow()
    ' 确保当前布局是模型空间
    ThisDrawing.ActiveLayout = ThisDrawing.Layouts.Item("Model")
   
    ' 设置打印设备
    ThisDrawing.ActiveLayout.ConfigName = "DWF6 ePlot.pc3"
   
    ' 设置打印比例为"布满图纸"
    ThisDrawing.ActiveLayout.StandardScale = acScaleToFit
   
    ' 设置图纸类型
    ThisDrawing.ActiveLayout.CanonicalMediaName = "ISO_A4_(210.00_x_297.00_MM)"
   
    ' 让AutoCAD在前台进行打印
    ThisDrawing.SetVariable "BACKGROUNDPLOT", 0
   
    Dim objPlot As AcadPlot
    Set objPlot = ThisDrawing.Plot
   
    ' 设置打印窗口
    Dim minPoint(0 To 1) As Double, maxPoint(0 To 1) As Double
    SetPoint2d minPoint, 0, 0
    SetPoint2d maxPoint, 800, 600
    ThisDrawing.ActiveLayout.SetWindowToPlot minPoint, maxPoint
   
    ' 设置打印类型
    ThisDrawing.ActiveLayout.PlotType = acWindow
   
    objPlot.PlotToFile "C:\test.dwf"
    
    ' 恢复系统变量的值
    ThisDrawing.SetVariable "BACKGROUNDPLOT", 2
End Sub

以下是解决的代码,速度不算慢,100张图7分钟,每张图都是先打开,再打印完,再关闭的。

能否这样,不打开图形,采用database.readdwg或者database.dxfin的方法进行打印?怎么实现?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System.IO;
using Excel;// =Microsoft.Office.Interop.Excel ;
using VB = Microsoft.VisualBasic;//用于激活窗口
using System.Runtime.InteropServices;//使用Marshal获得进程
using System.Reflection;//使用Missing.value
using FS = Scripting;//文件系统
using Autodesk.AutoCAD.PlottingServices;
using System.Collections.Specialized;


namespace GWDwgFrame
{
    public partial class DwgFrame : Form
    {
       

        private Excel.Application ExcelApp;//excel工程
        string excelPath;//Excel路径
        Excel.Workbook operBook;//操作book
        Excel.Worksheet operSheet;//操作sheet
        int iRow;//Excel循环数

        int finish;//完成数1-100
        string folderPath="";//文件夹路径
        string framePath="";//图框路径
        string operFilePath;//当前操作的文件路径
        string frameBlkRecName = "LoopNo";
        int iDwg;//操作文件的循环计数
        FS.FileSystemObject fso=new FS.FileSystemObject();
        FS.Folder dwgFolder;
        FS.Files dwgFileGroup;
        FS.File dwgFile;
        public System.Collections.ArrayList dwgFilesRoute=new System.Collections.ArrayList();//所有文件的路径
        public int dwgCount;//文件数计算
        string fileType="DXF";//文件类型,DXF或者DWG
        ObjectIdCollection frameIDCol;//复制块定义所需ID集合
        IdMapping acIdMap;// //复制数据库函数成员
        Autodesk.AutoCAD.DatabaseServices.Database operDb;//操作数据库
        Autodesk.AutoCAD.DatabaseServices.Database frameDb;//图框数据库
        //Document operDwgDoc;//操作图形文档
        string frameName;//图框名字,带后缀.dwg
        string dwgRefName;//外部参照名字
        string[] loopHead = new string[] { "文件名","回路名", "EPC图号", "业主图号" };
        string[] loopInfor = new string[4];//分别是回路名,回路名,EPC图号,业主图号
        Autodesk.AutoCAD.DatabaseServices.AttributeCollection attCollec;//快参照属性集合
        Autodesk.AutoCAD.DatabaseServices.AttributeReference attOper;//属性参照
        DwgVersion dwgSaveVer=DwgVersion.AC1015;//保存的版本2000
        public string devName;//打印设备
        public string devPaper;//打印图纸
        public bool plotToFile = false;//是否打印到图纸
        public PlotRotation rotAng;//旋转角度

//获得可用的打印机

private void DwgFrameLoad(object sender, EventArgs e)
        {
            //comboBoxFileType.SelectedIndex = 0;
            //comboBoxFileType.Text = "DXF";
            //comboBoxDwgVer.SelectedIndex = 1;//默认版本2000
            Document doc =Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            PlotSettingsValidator psv =PlotSettingsValidator.Current;
            StringCollection devlist =psv.GetPlotDeviceList();
            for (int i = 0; i < devlist.Count; i++)
            {
                comboBoxPrintDev.Items.Add(devlist);
            }

        }

//获得该打印机图纸
        private void getPaperSize(object sender, EventArgs e)
        {
            comboBoxPaperSize.Items.Clear();
            devName = comboBoxPrintDev.Text;
            Document doc =Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            PlotSettingsValidator psv =PlotSettingsValidator.Current;

            PlotSettings ps = new PlotSettings(true);
            psv.SetPlotConfigurationName(ps, devName, null);
            psv.RefreshLists(ps);
            StringCollection medlist =psv.GetCanonicalMediaNameList(ps);
            for (int i = 0; i < medlist.Count; i++)
            {
                comboBoxPaperSize.Items.Add(medlist);
            }


        }

        //打印图纸大小
        private void setPaperSize(object sender, EventArgs e)
        {
            devPaper = comboBoxPaperSize.Text;
        }

        //打印角度
        private void rotateAngle(object sender, EventArgs e)
        {
           string rot=comboBoxRotate.Text;
            if (rot=="0" )
            {
                rotAng = PlotRotation.Degrees000;
            }
            if (rot=="90" )
            {
                rotAng = PlotRotation.Degrees090;
            }
            if (rot=="180" )
            {
                rotAng = PlotRotation.Degrees180;
            }
            if (rot=="270" )
            {
                rotAng = PlotRotation.Degrees270;
            }
        }
        //是否打印到文件
        private void plottoFile(object sender, EventArgs e)
        {
            plotToFile=checkBoxPrintFile.Checked;

            if (plotToFile == true)
            {
                folderBrowserDialog1.SelectedPath = "";
                folderBrowserDialog1.Description = "请选择打印文件的存放文件夹";
                folderBrowserDialog1.ShowDialog();
               
                if (fso.FolderExists(folderBrowserDialog1.SelectedPath) == false)
                {
                    return;
                }
                folderPath = folderBrowserDialog1.SelectedPath;
                textBoxPintFolder.Text = "文件夹路径:" + folderPath;
                textBoxPintFolder.Visible = true;
                //dwgFolder = fso.GetFolder(folderPath);


                if (folderPath.Substring(folderPath.Length - 1, 1) == "\\")
                {
                    folderPath = folderPath ;
                }
                else
                {
                    folderPath = folderPath + "\\";
                }
            }
        }
        //开始打印
        private void buttonPrint_Click(object sender, EventArgs e)
        {
            string printFile;
            //PlotProgressDialog ppd=new   PlotProgressDialog(false, 1, true);
            //PlotEngine pe =                          PlotFactory.CreatePublishEngine();
            for (iDwg = 0; iDwg < dwgCount; iDwg++)
            {
                //打印结束才可打开新文档
                for (; ; )
                {
                    if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
                    //if (ppd.IsSheetCancelled)
                    {
                        break;
                    }
                }
                operFilePath = dwgFilesRoute[iDwg].ToString();//获得操作图形路径
                printFile = System.IO.Path.GetFileNameWithoutExtension(operFilePath);
                printFile = folderPath + printFile;
                //Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("REGENMODE", 0);
                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Open(operFilePath, false);
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
               
                doc.LockDocument();
                Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BACKGROUNDPLOT", 0);
               
                Editor ed = doc.Editor;
                Database db = doc.Database;

                Transaction tr =
                  db.TransactionManager.StartTransaction();
                using (tr)
                {
                    // We'll be plotting the current layout

                    BlockTableRecord btr =
                      (BlockTableRecord)tr.GetObject(
                        db.CurrentSpaceId,
                        OpenMode.ForRead
                      );
                    Layout lo =
                      (Layout)tr.GetObject(
                        btr.LayoutId,
                        OpenMode.ForRead
                      );

                    // We need a PlotInfo object
                    // linked to the layout

                    PlotInfo pi = new PlotInfo();
                    pi.Layout = btr.LayoutId;

                    // We need a PlotSettings object
                    // based on the layout settings
                    // which we then customize

                    PlotSettings ps =
                      new PlotSettings(lo.ModelType);
                    ps.CopyFrom(lo);

                    // The PlotSettingsValidator helps
                    // create a valid PlotSettings object

                    PlotSettingsValidator psv =
                      PlotSettingsValidator.Current;

                    // We'll plot the extents, centered and
                    // scaled to fit
                    psv.SetPlotRotation(ps, rotAng);
                    psv.SetPlotType(
                      ps,
                      Autodesk.AutoCAD.DatabaseServices.PlotType.Extents
                    );
                    psv.SetUseStandardScale(ps, true);
                    psv.SetStdScaleType(ps, StdScaleType.ScaleToFit);
                    psv.SetPlotCentered(ps, true);

                    // We'll use the standard DWF PC3, as
                    // for today we're just plotting to file

                    psv.SetPlotConfigurationName(
                      ps,
                      devName,//"Adobe PDF",
                      devPaper//"A3"
                    );

                    // We need to link the PlotInfo to the
                    // PlotSettings and then validate it

                    pi.OverrideSettings = ps;
                    PlotInfoValidator piv =
                      new PlotInfoValidator();
                    piv.MediaMatchingPolicy =
                      MatchingPolicy.MatchEnabled;
                    piv.Validate(pi);

                    // A PlotEngine does the actual plotting
                    // (can also create one for Preview)

                    //if (PlotFactory.ProcessPlotState ==
                    //    ProcessPlotState.NotPlotting)

                    PlotEngine pe =
                      PlotFactory.CreatePublishEngine();
                    using (pe)
                    {
                            // Create a Progress Dialog to provide info
                            // and allow thej user to cancel

                        PlotProgressDialog ppd = new PlotProgressDialog(false, 1, true);
                            using (ppd)
                            {
                                ppd.set_PlotMsgString(
                                  PlotMessageIndex.DialogTitle,
                                  "正在打印"+operFilePath//"Custom Plot Progress"
                                );
                                ppd.set_PlotMsgString(
                                  PlotMessageIndex.CancelJobButtonMessage,
                                  "取消当前打印"//"Cancel Job"
                                );
                                ppd.set_PlotMsgString(
                                  PlotMessageIndex.CancelSheetButtonMessage,
                                  "取消本页打印"//"Cancel Sheet"
                                );
                                ppd.set_PlotMsgString(
                                  PlotMessageIndex.SheetSetProgressCaption,
                                  "打印集合进度"//"Sheet Set Progress"
                                );
                                ppd.set_PlotMsgString(
                                  PlotMessageIndex.SheetProgressCaption,
                                  "打印页进度"//"Sheet Progress"
                                );
                                ppd.LowerPlotProgressRange = 0;
                                ppd.UpperPlotProgressRange = 100;
                                ppd.PlotProgressPos = 0;

                                // Let's start the plot, at last

                                ppd.OnBeginPlot();
                                ppd.IsVisible = true;
                                pe.BeginPlot(ppd, null);

                                // We'll be plotting a single document

                                pe.BeginDocument(
                                  pi,
                                  doc.Name,
                                  null,
                                  1,
                                  plotToFile,//true, // Let's plot to file
                                  printFile//"c:\\test-output"
                                );

                                // Which contains a single sheet

                                ppd.OnBeginSheet();

                                ppd.LowerSheetProgressRange = 0;
                                ppd.UpperSheetProgressRange = 100;
                                ppd.SheetProgressPos = 0;

                                PlotPageInfo ppi = new PlotPageInfo();
                                pe.BeginPage(
                                  ppi,
                                  pi,
                                  true,
                                  null
                                );
                                pe.BeginGenerateGraphics(null);
                                pe.EndGenerateGraphics(null);

                                // Finish the sheet
                                pe.EndPage(null);
                                ppd.SheetProgressPos = 100;
                                ppd.OnEndSheet();

                                // Finish the document

                                pe.EndDocument(null);

                                // And finish the plot

                                ppd.PlotProgressPos = 100;
                                ppd.OnEndPlot();
                                pe.EndPlot(null);
                               

                            }
                        }//using pe
                   
                   
                }
                for (; ; )
                {
                    this.Update();
                    //if (ppd.IsDisposed)
                    if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
                    {
                        break;
                    }
                }
                //for (int i = 0; i < 10000000; i++)
                //{
                //    if (ppd.IsPlotCancelled)
                //        if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting)
                //        {
                //            break;
                //        }
                //}
                doc.CloseAndDiscard();
                labelExecuteCondition.Text = "正在打印,请等待……";
                finish = (int)((Double)(iDwg + 1) / (Double)(dwgCount) * 100);
                progressBar1.Value = finish;
                progressBar1.Visible = true;
                labelExecuteCondition.Visible = true;
                this.Update();
               
            }
            Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("打印结束");
            progressBar1.Visible = false;
            labelExecuteCondition.Visible = false;
            Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Add("");


           
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2009-10-2 15:08 | 显示全部楼层
 楼主| 发表于 2009-10-5 18:47 | 显示全部楼层
我看了那些kean的文章,实在是太复杂了,就这么一个打印功能,搞的如此复杂,真实有点怕了!
发表于 2009-10-9 23:52 | 显示全部楼层
我也想搞一个.以前用VBA搞了一个.想改成C#的.可是就是不知怎么改.
发表于 2017-12-5 14:03 | 显示全部楼层
有办法把所有PDF合并成一个吗
发表于 2017-12-6 09:50 | 显示全部楼层
menethil 发表于 2017-12-5 14:03
有办法把所有PDF合并成一个吗

两个方法:
1、pdfFactory pro
2、用第三方pdf操作库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 20:10 , Processed in 0.367424 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表