/************************************************************************************ * Copyright (c) 2018 All Rights Reserved. * CLR版本: 4.0.30319.36399 *机器名称:HUBING *公司名称:杭州康勒科技有限公司 *命名空间:HelloTeamcenter.hello *文件名: PrintDwg *版本号: V1.0.0.0 *唯一标识:0679f0a0-c63f-454a-8a8f-b7db7cb9cfc6 *当前的用户域:HUBING *创建人: hub *电子邮箱:hub@connor.net.cn *创建时间:2018/5/28 16:26:39 *描述: * *===================================================================== *修改标记 *修改时间:2018/5/28 16:26:39 *修改人: hub *版本号: V1.0.0.0 *描述: * /************************************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //*******************************************// // Type Library // //*******************************************// //using ZwSoft.ZwCAD.Customization; //accui.dll //*******************************************// // acdbmgd.dll // //*******************************************// using ZwSoft.ZwCAD.Runtime; using ZwSoft.ZwCAD.LayerManager; using ZwSoft.ZwCAD.GraphicsSystem; using ZwSoft.ZwCAD.GraphicsInterface; using ZwSoft.ZwCAD.Geometry; using ZwSoft.ZwCAD.DatabaseServices.Filters; using ZwSoft.ZwCAD.DatabaseServices; using ZwSoft.ZwCAD.Colors; //******************************************// //--------------------------------------------// // acmgd.dll // //------------------------------------------*// //using ZwSoft.ZwCAD.Windows.ToolPalette; using ZwSoft.ZwCAD.Windows; using ZwSoft.ZwCAD.Publishing; using ZwSoft.ZwCAD.PlottingServices; using ZwSoft.ZwCAD.EditorInput; using ZwSoft.ZwCAD.ApplicationServices; using AcAp = ZwSoft.ZwCAD.ApplicationServices.Application; using DataSvr = ZwSoft.ZwCAD.DatabaseServices; using System.Collections; using System.Threading; using System.Collections.Specialized; using HelloTeamcenter.hello; using iTextSharp.text.pdf; using System.IO; using iTextSharp.text; namespace KCad { public class FrameCompare : IComparer { // Calls CaseInsensitiveComparer.Compare with the parameters reversed. int IComparer.Compare(Object x, Object y) { if (string.Compare((x as PrintFrame).BKName, (y as PrintFrame).BKName, true) == 0) { return 0; } return -1; } } public class PrintFrame { public string BKName { get; set; } public string MediaName { get; set; } public Extents2d PrintBound { get; set; } public DataSvr.PlotRotation Rotation { get; set; } public void Clone(PrintFrame obj) { BKName = obj.BKName; MediaName = obj.MediaName; PrintBound = obj.PrintBound; Rotation = obj.Rotation; BlockF = obj.BlockF; } public string BlockF { get; set; } public double _X { get; set; } public double _Y { get; set; } } public class PrintDwg { private ArrayList m_Frame = null; private string CAD_BLOCK_SIZE_MAPPING = "CN_cad_block_size_mapping"; public PrintDwg(ZwSoft.ZwCAD.ApplicationServices.Document doc) { m_Frame = new ArrayList(); // m_Frame.Add(new PrintFrame() { BKName = "KHGY-TH", MediaName = "ISO_expand_A4_(297.00_x_210.00_MM)", Rotation = DataSvr.PlotRotation.Degrees000 }); // m_Frame.Add(new PrintFrame() { BKName = "KHGY-TK", MediaName = "ISO_expand_A4_(297.00_x_210.00_MM)", Rotation = DataSvr.PlotRotation.Degrees000 }); // m_Frame.Add(new PrintFrame() { BKName = "KHTH-H", MediaName = "ISO_expand_A4_(297.00_x_210.00_MM)", Rotation = DataSvr.PlotRotation.Degrees000 }); // m_Frame.Add(new PrintFrame() { BKName = "KHTH-H-A3", MediaName = "ISO_expand_A3_(420.00_x_297.00_MM)", Rotation = DataSvr.PlotRotation.Degrees000 }); // m_Frame.Add(new PrintFrame() { BKName = "KHTH-Z", MediaName = "ISO_expand_A4_(297.00_x_210.00_MM)", Rotation = DataSvr.PlotRotation.Degrees090 }); // m_Frame.Add(new PrintFrame() { BKName = "KHTH-Z-A3", MediaName = "ISO_expand_A3_(420.00_x_297.00_MM)", Rotation = DataSvr.PlotRotation.Degrees090 }); // m_Frame.Add(new PrintFrame() { BKName = "a3n", MediaName = "ISO_expand_A3_(420.00_x_297.00_MM)", Rotation = DataSvr.PlotRotation.Degrees090 }); Editor ed1 = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; try { Tool tool = new Tool(); Hashtable pre = tool.getTCPreferences(CAD_BLOCK_SIZE_MAPPING); string[] prevalues = (string[])pre[CAD_BLOCK_SIZE_MAPPING]; //string[] prevalues = new String[] { "A0-H=A0=841.00_x_1189.00=W", "A1-H=A1=841.00_x_594.00=W","A2-H=A2=594.00_x_420.00=W", "A4-S=A4=297.00_x_210.00=H" };//{ "A0-H=A0=841.00_x_1189.00=W"}; if (prevalues != null && prevalues.Length > 0) { foreach (string value in prevalues) { ed1.WriteMessage("REF=>" + value+"\n"); string[] values = value.Split("=".ToCharArray()); if (values.Length == 4) { //a3n=A3=420.00_x_297.00 if (values[3].Equals("W")) { ed1.WriteMessage("REF=90=>\n"); m_Frame.Add(new PrintFrame() { BKName = values[0], MediaName = String.Format("ISO_expand_{0}_({1}_MM)", values[1], values[2]), Rotation = DataSvr.PlotRotation.Degrees090, BlockF = values[3] }); }else{ ed1.WriteMessage("REF=00=>\n"); m_Frame.Add(new PrintFrame() { BKName = values[0], MediaName = String.Format("ISO_expand_{0}_({1}_MM)", values[1], values[2]), Rotation = DataSvr.PlotRotation.Degrees090, BlockF = values[3] }); } } } } }catch(System.Exception e){ ed1.WriteMessage(e.StackTrace); } PrintDoc = doc; } /// /// PDF旋转90度 /// /// public string PdfTo90(string inputfilepath, PrintFrame frame) { string pdfNewPath =null; if (frame.BlockF.Equals("W")) { pdfNewPath = inputfilepath.Replace("DWG_PDF", "DWG_PDF_M"); }else{ pdfNewPath = inputfilepath.Replace("DWG_PDF", "DWG_PDF_M"); //pdfNewPath = inputfilepath; //return pdfNewPath; } PdfReader pdfReader = null; PdfStamper pdfStamper = null; Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; try { pdfReader = new PdfReader(inputfilepath); pdfStamper = new PdfStamper(pdfReader, new FileStream(pdfNewPath, FileMode.Create)); int numberOfPages = pdfReader.NumberOfPages; for (int i = 1; i <= numberOfPages; i++) { //转换角度 if (frame.BlockF.Equals("W")) { PdfDictionary page = pdfReader.GetPageN(i); PdfNumber rotate = page.GetAsNumber(PdfName.ROTATE); int rotation = rotate == null ? 90 : (rotate.IntValue + 90) % 360; page.Put(PdfName.ROTATE, new PdfNumber(rotation)); } //获取PDFsize iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1); float width = psize.Width; float height = psize.Height; iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(global::HelloTeamcenter.Properties.Resources.SY, iTextSharp.text.BaseColor.WHITE); image.GrayFill = 20;//透明度,灰色填充 //水印的位置 image.SetAbsolutePosition((width - image.Width )/2, (height - image.Height )/2 ); PdfContentByte waterMarkContent = pdfStamper.GetUnderContent(i); waterMarkContent.AddImage(image); pdfStamper.Close(); pdfReader.Close(); } }catch(System.Exception){ cadEditor.WriteMessage("转换PDF出现异常"); } return pdfNewPath; } /// /// 合成pdf文件 /// /// 文件名list /// 输出路径 public static void mergePDFFiles(PrintFrame[] frames ,List fileList, string outMergeFile) { if (fileList.Count == 1 ) { File.Copy(fileList[0], outMergeFile,true); return; } Spire.Pdf.PdfDocument outPdf = new Spire.Pdf.PdfDocument(); for (int i = 0; i < fileList.Count;i++ ) { Spire.Pdf.PdfDocument inPdf = new Spire.Pdf.PdfDocument(); inPdf.LoadFromFile(fileList[i]); Spire.Pdf.PdfPageBase page = outPdf.Pages.Add(inPdf.Pages[0].Size, new Spire.Pdf.Graphics.PdfMargins(0)); inPdf.Pages[0].CreateTemplate().Draw(page, new System.Drawing.PointF(0, 0)); } outPdf.SaveToFile(outMergeFile); /* PdfReader reader; // Rectangle rec = new Rectangle(1660, 1000); iTextSharp.text.Document document = new iTextSharp.text.Document(); PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create)); document.Open(); PdfContentByte cb = writer.DirectContent; PdfImportedPage newPage; for (int i = 0; i < fileList.Count; i++) { reader = new PdfReader(fileList[i]); iTextSharp.text.Rectangle psize = reader.GetPageSize(1); float width = psize.Width; float height = psize.Height; int iPageNum = reader.NumberOfPages; for (int j = 1; j <= iPageNum; j++) { document.NewPage(); newPage = writer.GetImportedPage(reader, j); page = pdf2.Pages.Add(pdf.Pages[i].Size, newPdfMargins(0)); cb.AddTemplate(newPage, 0,0);//,width, height); } } document.Close(); * */ } /// /// 导出PDF /// /// PDF路径 /// public string CreatePdf(PrintFrame frame,int index) { string pdfPath = ""; Database database = PrintDoc.Database; //; Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction transaction = database.TransactionManager.StartTransaction()) { short backgroundPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT"); Application.SetSystemVariable("BACKGROUNDPLOT", 0); BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead); PlotInfo plotInfo = new PlotInfo(); PlotInfoValidator plotInfoValidator = new PlotInfoValidator(); plotInfoValidator.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting) { using (PlotEngine plotEngine = PlotFactory.CreatePublishEngine()) { // Create a Progrel.ass Dialog to provide info // and allow thej user to cancel using (PlotProgressDialog plotProcessDialog = new PlotProgressDialog(false, 1, true)) { BlockTableRecord acBlkTblRec = transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; Layout layout = (Layout)transaction.GetObject(acBlkTblRec.LayoutId, OpenMode.ForRead); // We need a PlotSettings object // based on the layout settings // which we then customize PlotSettings plotSetting= new PlotSettings(layout.ModelType); plotSetting.CopyFrom(layout); // The PlotSettingsValidator helps // create a valid PlotSettings object PlotSettingsValidator plotSettingValidator = PlotSettingsValidator.Current; // We'll plot the extents, centered and // scaled to fit StringCollection stringCollection = plotSettingValidator.GetPlotStyleSheetList(); bool StyleSheetCheck = false; foreach (string s in stringCollection) { if (string.Compare(s, "monochrome.ctb", true) == 0) { StyleSheetCheck = true; } } plotSettingValidator.SetPlotConfigurationName(plotSetting, "DWG To PDF.pc5", frame.MediaName); plotSettingValidator.SetPlotWindowArea(plotSetting, frame.PrintBound); plotSettingValidator.SetPlotType(plotSetting, ZwSoft.ZwCAD.DatabaseServices.PlotType.Window); if (!StyleSheetCheck) { plotSettingValidator.SetCurrentStyleSheet(plotSetting, "monochrome.stb"); } else { plotSettingValidator.SetCurrentStyleSheet(plotSetting, "monochrome.ctb"); } plotSettingValidator.SetPlotCentered(plotSetting, true); if(frame.BKName.ToUpper().Equals("A4-S")){ plotSettingValidator.SetPlotRotation(plotSetting, PlotRotation.Degrees090); cadEditor.WriteMessage("IS A4-S SET Degrees090 "); } plotSettingValidator.SetUseStandardScale(plotSetting, true); plotSettingValidator.SetStdScaleType(plotSetting, StdScaleType.ScaleToFit); // We need a PlotInfo object // linked to the layout plotInfo.Layout = acBlkTblRec.LayoutId; // Make the layout we're plotting current LayoutManager.Current.CurrentLayout = layout.LayoutName; // We need to link the PlotInfo to the // PlotSettings and then validate it plotInfo.OverrideSettings = plotSetting; plotInfoValidator.Validate(plotInfo); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); plotProcessDialog.LowerPlotProgressRange = 0; plotProcessDialog.UpperPlotProgressRange = 100; plotProcessDialog.PlotProgressPos = 0; // Let's start the plot, at last plotProcessDialog.OnBeginPlot(); plotProcessDialog.IsVisible = true; plotEngine.BeginPlot(plotProcessDialog, null); pdfPath = String.Format("{0}\\{1}_{2}.pdf", System.Environment.GetEnvironmentVariable("TEMP").ToString(),"DWG_PDF_",index); plotEngine.BeginDocument(plotInfo, PrintDoc.Name, null, 1, true, pdfPath); // psv.SetPlotRotation(ps, DataSvr.PlotRotation.Degrees090); // Which may contain multiple sheets plotProcessDialog.StatusMsgString = "Plotting " + PrintDoc.Name.Substring(PrintDoc.Name.LastIndexOf("\\") + 1) + " - sheet 1 of 1" ; plotProcessDialog.OnBeginSheet(); plotProcessDialog.LowerSheetProgressRange = 0; plotProcessDialog.UpperSheetProgressRange = 100; plotProcessDialog.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); plotEngine.BeginPage(ppi, plotInfo, true, null); plotEngine.BeginGenerateGraphics(null); plotProcessDialog.SheetProgressPos = 50; plotEngine.EndGenerateGraphics(null); // Finish the sheet plotEngine.EndPage(null); plotProcessDialog.SheetProgressPos = 100; plotProcessDialog.OnEndSheet(); // Finish the document plotEngine.EndDocument(null); // And finish the plot plotProcessDialog.PlotProgressPos = 100; plotProcessDialog.OnEndPlot(); plotEngine.EndPlot(null); plotProcessDialog.Dispose(); } if (File.Exists(pdfPath)) { pdfPath = PdfTo90(pdfPath, frame); } } } else { PrintDoc.Editor.WriteMessage("\nAnother plot is in progress."); } Application.SetSystemVariable("BACKGROUNDPLOT", backgroundPlot); transaction.Commit(); } return pdfPath; } /// /// 生成多个PDF /// /// /// public string MultiSheetPlot2(String pdfName) { string path = ""; Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; PrintFrame[] frames = CheckModelSpaceTitle(); if (frames.Length < 1) return ""; List pdfNameList = new List(); for (int i =0;i< frames.Length;i++) { PrintFrame frame =frames[i]; string pdfPath = CreatePdf(frame, i); cadEditor.WriteMessage("pdfPath =>" + pdfPath + "\n"); pdfNameList.Add(pdfPath); } path = String.Format("{0}\\{1}.pdf", System.Environment.GetEnvironmentVariable("TEMP").ToString(), pdfName); cadEditor.WriteMessage("pdfName =>" + path + "\n"); //合并PDF mergePDFFiles( frames,pdfNameList,path); return path; } public string MultiSheetPlot(String pdfName) { string path = ""; Database database = PrintDoc.Database; //; Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction transaction = database.TransactionManager.StartTransaction()) { short backgroundPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT"); Application.SetSystemVariable("BACKGROUNDPLOT", 0); BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead); PlotInfo plotInfo = new PlotInfo(); PlotInfoValidator plotInfoValidator = new PlotInfoValidator(); plotInfoValidator.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; // A PlotEngine does the actual plotting // (can also create one for Preview) if (PlotFactory.ProcessPlotState == ProcessPlotState.NotPlotting) { using (PlotEngine plotEngine = PlotFactory.CreatePublishEngine()) { PrintFrame[] frames = CheckModelSpaceTitle(); // Create a Progrel.ass Dialog to provide info // and allow thej user to cancel using (PlotProgressDialog plotProcessDialog = new PlotProgressDialog(false, frames.Length, true)) { int numSheet = 1; if (frames.Length < 1) return ""; foreach (PrintFrame frame in frames) { BlockTableRecord acBlkTblRec = transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; Layout lo = (Layout)transaction.GetObject(acBlkTblRec.LayoutId, OpenMode.ForRead); // 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 StringCollection cols = psv.GetPlotStyleSheetList(); bool StyleSheetCheck = false; foreach (string s in cols) { if (string.Compare(s, "monochrome.ctb", true) == 0) { StyleSheetCheck = true; } } psv.SetPlotConfigurationName(ps, "DWG To PDF.pc3", frame.MediaName); psv.SetPlotWindowArea(ps, frame.PrintBound); psv.SetPlotType(ps, ZwSoft.ZwCAD.DatabaseServices.PlotType.Window); psv.SetPlotRotation(ps, DataSvr.PlotRotation.Degrees090); if (!StyleSheetCheck) psv.SetCurrentStyleSheet(ps, "monochrome.stb"); else psv.SetCurrentStyleSheet(ps, "monochrome.ctb"); psv.SetPlotCentered(ps, true); psv.SetUseStandardScale(ps, true); psv.SetStdScaleType(ps, StdScaleType.ScaleToFit); // cadEditor.WriteMessage("Rooation=>>" + frame.Rotation); // psv.SetPlotRotation(ps, DataSvr.PlotRotation.Degrees090);// frame.Rotation); // We need a PlotInfo object // linked to the layout plotInfo.Layout = acBlkTblRec.LayoutId; // Make the layout we're plotting current LayoutManager.Current.CurrentLayout = lo.LayoutName; // We need to link the PlotInfo to the // PlotSettings and then validate it plotInfo.OverrideSettings = ps; plotInfoValidator.Validate(plotInfo); if (numSheet == 1) { plotProcessDialog.set_PlotMsgString(PlotMessageIndex.DialogTitle, "Custom Plot Progress"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "Cancel Job"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "Cancel Sheet"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); plotProcessDialog.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); plotProcessDialog.LowerPlotProgressRange = 0; plotProcessDialog.UpperPlotProgressRange = 100; plotProcessDialog.PlotProgressPos = 0; // Let's start the plot, at last plotProcessDialog.OnBeginPlot(); plotProcessDialog.IsVisible = true; plotEngine.BeginPlot(plotProcessDialog, null); // We'll be plotting a single document // Let's plot to file path = PrintDoc.Name.ToUpper().Replace(".DWG", string.Format("{0}{1}", frame.BKName, ".PDF")); //myPdfName path = path.Substring(0, path.LastIndexOf('\\') + 1) + pdfName+"1.PDF"; plotEngine.BeginDocument(plotInfo, PrintDoc.Name, null, 1, true, path); } // psv.SetPlotRotation(ps, DataSvr.PlotRotation.Degrees090); // Which may contain multiple sheets plotProcessDialog.StatusMsgString = "Plotting " + PrintDoc.Name.Substring(PrintDoc.Name.LastIndexOf("\\") + 1) + " - sheet " + numSheet.ToString() + " of " + frames.Length.ToString(); plotProcessDialog.OnBeginSheet(); plotProcessDialog.LowerSheetProgressRange = 0; plotProcessDialog.UpperSheetProgressRange = 100; plotProcessDialog.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); plotEngine.BeginPage(ppi, plotInfo, frames.Length == numSheet, null); plotEngine.BeginGenerateGraphics(null); plotProcessDialog.SheetProgressPos = 50; plotEngine.EndGenerateGraphics(null); // Finish the sheet plotEngine.EndPage(null); plotProcessDialog.SheetProgressPos = 100; plotProcessDialog.OnEndSheet(); numSheet++; //Thread.Sleep(30000); } // Finish the document plotEngine.EndDocument(null); // And finish the plot plotProcessDialog.PlotProgressPos = 100; plotProcessDialog.OnEndPlot(); plotEngine.EndPlot(null); plotProcessDialog.Dispose(); } if (File.Exists(path)) { if (PDFWatermark(path, path.Replace("1.PDF", ".pdf"), 0, 0, frames)) { return path.Replace("1.PDF", ".pdf"); } } } } else { PrintDoc.Editor.WriteMessage("\nAnother plot is in progress."); } Application.SetSystemVariable("BACKGROUNDPLOT", backgroundPlot); transaction.Commit(); } return path; } // 检查是否存在边框 private PrintFrame[] CheckModelSpaceTitle() { Database acCurDb = PrintDoc.Database; List lstFrame = new List(); Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record for read BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; BlockReference reference; BlockTableRecordEnumerator enumbtr = acBlkTblRec.GetEnumerator(); while (enumbtr.MoveNext()) { Entity entity = acTrans.GetObject(enumbtr.Current, OpenMode.ForRead) as Entity; if (entity is BlockReference) { reference = entity as BlockReference; //int i = m_Frame.BinarySearch(new PrintFrame() { BKName = reference.Name }, new FrameCompare()); int i = -1; for (int j = 0; j < m_Frame.Count; j++) { if (string.Compare((m_Frame[j] as PrintFrame).BKName, reference.Name, true) == 0) { i = j; break; } } if (i > -1) { Extents2d e2dBound = new Extents2d(reference.Bounds.Value.MinPoint.X, reference.Bounds.Value.MinPoint.Y, reference.Bounds.Value.MaxPoint.X, reference.Bounds.Value.MaxPoint.Y); (m_Frame[i] as PrintFrame).PrintBound = e2dBound; PrintFrame frm = new PrintFrame(); frm.Clone((m_Frame[i] as PrintFrame)); cadEditor.WriteMessage("MinPoint=>" + reference.Bounds.Value.MinPoint.X + "|" + reference.Bounds.Value.MinPoint.Y); cadEditor.WriteMessage("MaxPoint=>" + reference.Bounds.Value.MaxPoint.X + "|" + reference.Bounds.Value.MaxPoint.Y); frm._X = reference.Bounds.Value.MaxPoint.X - reference.Bounds.Value.MinPoint.X; frm._Y = reference.Bounds.Value.MaxPoint.Y - reference.Bounds.Value.MinPoint.Y; lstFrame.Add(frm); } } } acTrans.Commit(); } return lstFrame.ToArray(); } public ZwSoft.ZwCAD.ApplicationServices.Document PrintDoc { get; set; } public bool PDFWatermark(string inputfilepath, string outputfilepath, float top, float left,PrintFrame[] frames) { //throw new NotImplementedException(); PdfReader pdfReader = null; PdfStamper pdfStamper = null; Editor cadEditor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; try { pdfReader = new PdfReader(inputfilepath); int numberOfPages = pdfReader.NumberOfPages; iTextSharp.text.Rectangle psize = pdfReader.GetPageSize(1); float width = psize.Width; float height = psize.Height; cadEditor.WriteMessage(String.Format("\nwidth = {0}/height = {1}\n",width, height)); pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create)); PdfContentByte waterMarkContent; //global::HelloTeamcenter.Properties.Resources.SY.; iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(global::HelloTeamcenter.Properties.Resources.SY,iTextSharp.text.BaseColor.WHITE); //iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName); image.GrayFill = 20;//透明度,灰色填充 //image.Rotation//旋转 //image.RotationDegrees//旋转角度 //水印的位置 if (left <= 0) { left = (width /2- image.Width/2) + left; } image.SetAbsolutePosition(left, (height/2 - image.Height/2) - top); //每一页加水印,也可以设置某一页加水印 for (int i = 1; i <= numberOfPages; i++) { PdfDictionary page = pdfReader.GetPageN(i); //reader.getPageN(i); //iTextSharp.text.Rectangle pageSize = pdfReader.GetPageSize(i); // float myW = pageSize.Right - pageSize.Left; // float myH = pageSize.Top - pageSize.Bottom; // cadEditor.WriteMessage(String.Format("W={0}/H={1}\n", myW, myH)); if (frames != null && frames.Length == numberOfPages && frames[i].BlockF.Equals("W")) { PdfNumber rotate = page.GetAsNumber(PdfName.ROTATE); int rotation = rotate == null ? 90 : (rotate.IntValue + 90) % 360; page.Put(PdfName.ROTATE, new PdfNumber(rotation)); } waterMarkContent = pdfStamper.GetUnderContent(i); waterMarkContent.AddImage(image); } //strMsg = "success"; return true; } catch (System.Exception ex) { ex.Message.Trim(); return false; } finally { if (pdfStamper != null) pdfStamper.Close(); if (pdfReader != null) pdfReader.Close(); } } } }