using connor_zwcadm.model; using connor_zwcadm.util; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.Threading.Tasks; using ZwSoft.ZwCAD.ApplicationServices; using ZwSoft.ZwCAD.DatabaseServices; using ZwSoft.ZwCAD.Geometry; using ZwSoft.ZwCAD.Internal; using ZwSoft.ZwCAD.PlottingServices; namespace connor_zwcadm.commands { public class ConvertPDFCommand { public static string ConvertPDF(Document doc, Dictionary plotInfos, string path) { if (doc == null) { throw new Exception("图纸不能为null"); } string cadPath = doc.Name; KUtil.Log("转PDF: " + cadPath); KUtil.Log("PDF路径:" + path); if (path.Contains("/")) { path = path.Replace("/", ""); } string pdfTempPath = System.IO.Path.GetTempPath() + "\\" + path; //string pdfTempPath = cadPath.Substring(0, cadPath.LastIndexOf('\\') + 1) + path; Database db = doc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); List blocks; List blockRefRegexs; KCADUtil.GetBlocksByRegex(tr, db, bt, OpenMode.ForRead, out blocks, out blockRefRegexs, plotInfos.Keys.ToArray()); int blockCnt = blocks == null ? 0 : blocks.Count; KUtil.Log("找到块数量:" + blockCnt); if (blockCnt == 0) { KUtil.Log("无需转换pdf"); //throw new Exception("图纸中没有找到需要打印的块"); return "OFF"; } PlotInfo pi = new PlotInfo(); PlotInfoValidator piv = new PlotInfoValidator(); piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) { throw new Exception("其他打印正在执行"); } short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT"); Application.SetSystemVariable("BACKGROUNDPLOT", 0); using (PlotEngine pe = PlotFactory.CreatePublishEngine()) { using (PlotProgressDialog ppd = new PlotProgressDialog(false, blockCnt, true)) { PlotSettingsValidator psv = PlotSettingsValidator.Current; StringCollection cols = psv.GetPlotStyleSheetList(); bool StyleSheetCheck = false; foreach (string s in cols) { if (string.Compare(s, "monochrome.ctb", true) == 0) { StyleSheetCheck = true; } } BlockTableRecord acBlkTblRec = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; Layout lo = (Layout)tr.GetObject(acBlkTblRec.LayoutId, OpenMode.ForRead); PlotSettings ps = new PlotSettings(lo.ModelType); ps.CopyFrom(lo); ps.PrintLineweights = true; for (int i = 0; i < blockCnt; i++) { BlockReference blockRef = blocks[i]; PlotData plotData = plotInfos[blockRefRegexs[i]]; //psv.SetPlotConfigurationName(ps, "DWG To PDF.pc5", plotData.MediaName); try { KUtil.Log("plotData.TitleBlockName====" + plotData.TitleBlockName); if (!string.IsNullOrEmpty(plotData.TitleBlockName) && plotData.TitleBlockName.IndexOf("portrait", StringComparison.OrdinalIgnoreCase) >= 0) { psv.SetPlotConfigurationName(ps, "DWG to PDF.pc5", null); } else { psv.SetPlotConfigurationName(ps, "DWG to PDF横向.pc5", null); } psv.RefreshLists(ps); StringCollection medlist = psv.GetCanonicalMediaNameList(ps); KUtil.Log(plotData.MediaName); Boolean flag = true; for (int j = 0; j < medlist.Count; j++) { KUtil.Log("medlist[j]===="+medlist[j]); if (plotData.MediaName.Equals(medlist[j])) { KUtil.Log("1111111111111111111"); if (!string.IsNullOrEmpty(plotData.TitleBlockName) && plotData.TitleBlockName.IndexOf("portrait", StringComparison.OrdinalIgnoreCase) >= 0) { psv.SetPlotConfigurationName(ps, "DWG To PDF.pc5", medlist[j]); } else { psv.SetPlotConfigurationName(ps, "DWG to PDF横向.pc5", medlist[j]); } flag = false; break; } //KUtil.Log(medlist[j]); } if (flag) { if (!string.IsNullOrEmpty(plotData.TitleBlockName) && plotData.TitleBlockName.IndexOf("portrait", StringComparison.OrdinalIgnoreCase) >= 0) { psv.SetPlotConfigurationName(ps, "DWG To PDF.pc5", plotData.MediaName); } else { psv.SetPlotConfigurationName(ps, "DWG to PDF横向.pc5", plotData.MediaName); } } } catch (SystemException ex) { KUtil.Log("错误行开始:"); KUtil.Log("错误状态:" + ex.InnerException.ToString()); KUtil.Log("异常消息:" + ex.Message.ToString()); KUtil.Log("Source:" + ex.Source.ToString()); KUtil.Log("StackTrace:" + ex.StackTrace.ToString()); KUtil.Log("TargetSite:" + ex.TargetSite.ToString()); } Point3d minPoint = blockRef.Bounds.Value.MinPoint; Point3d maxPoint = blockRef.Bounds.Value.MaxPoint; // psv.SetPlotWindowArea(ps, new Extents2d(minPoint.X, minPoint.Y, maxPoint.X, maxPoint.Y)); psv.SetPlotType(ps, ZwSoft.ZwCAD.DatabaseServices.PlotType.Window); 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); psv.SetPlotRotation(ps, plotData.Rotate ? PlotRotation.Degrees090 : PlotRotation.Degrees000); pi.Layout = acBlkTblRec.LayoutId; LayoutManager.Current.CurrentLayout = lo.LayoutName; pi.OverrideSettings = ps; piv.Validate(pi); if (i == 0) { ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "转PDF"); //ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "取消打印"); //ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "取消当前页打印"); //ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); //ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); ppd.LowerPlotProgressRange = 0; ppd.UpperPlotProgressRange = blockCnt; ppd.PlotProgressPos = 0; ppd.OnBeginPlot(); ppd.IsVisible = true; pe.BeginPlot(ppd, null); pe.BeginDocument(pi, cadPath, null, 1, true, pdfTempPath); } ppd.StatusMsgString = "打印 " + System.IO.Path.GetFileName(cadPath) + " - 页 ( " + (i + 1) + " / " + blockCnt + " )"; ppd.PlotProgressPos = i; ppd.OnBeginSheet(); ppd.LowerSheetProgressRange = 0; ppd.UpperSheetProgressRange = 100; ppd.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); pe.BeginPage(ppi, pi, i == blockCnt - 1, null); pe.BeginGenerateGraphics(null); ppd.SheetProgressPos = 50; pe.EndGenerateGraphics(null); pe.EndPage(null); ppd.SheetProgressPos = 100; ppd.OnEndSheet(); } pe.EndDocument(null); ppd.PlotProgressPos = 100; ppd.OnEndPlot(); pe.EndPlot(null); ppd.Dispose(); } } Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot); tr.Commit(); } KUtil.Log("pdfTempPath:" + pdfTempPath); KUtil.Log("转换PDF完成"); return pdfTempPath; } public static string ConvertPDF(Document doc, Dictionary plotInfos) { if (doc == null) { throw new Exception("图纸不能为null"); } string cadPath = doc.Name; KUtil.Log("转PDF: " + cadPath); string path = cadPath.Substring(0, cadPath.Length - 4) + ".pdf"; KUtil.Log("PDF路径:" + path); Database db = doc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); List blocks; List blockRefRegexs; KCADUtil.GetBlocksByRegex(tr, db, bt, OpenMode.ForRead, out blocks, out blockRefRegexs, plotInfos.Keys.ToArray()); int blockCnt = blocks == null ? 0 : blocks.Count; KUtil.Log("找到块数量:" + blockCnt); if (blockCnt == 0) { KUtil.Log("无需转换pdf"); //throw new Exception("图纸中没有找到需要打印的块"); return "OFF"; } PlotInfo pi = new PlotInfo(); PlotInfoValidator piv = new PlotInfoValidator(); piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) { throw new Exception("其他打印正在执行"); } short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT"); Application.SetSystemVariable("BACKGROUNDPLOT", 0); using (PlotEngine pe = PlotFactory.CreatePublishEngine()) { using (PlotProgressDialog ppd = new PlotProgressDialog(false, blockCnt, true)) { PlotSettingsValidator psv = PlotSettingsValidator.Current; StringCollection cols = psv.GetPlotStyleSheetList(); bool StyleSheetCheck = false; foreach (string s in cols) { if (string.Compare(s, "monochrome.ctb", true) == 0) { StyleSheetCheck = true; } } BlockTableRecord acBlkTblRec = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; Layout lo = (Layout)tr.GetObject(acBlkTblRec.LayoutId, OpenMode.ForRead); PlotSettings ps = new PlotSettings(lo.ModelType); ps.CopyFrom(lo); ps.PrintLineweights = true; for (int i = 0; i < blockCnt; i++) { BlockReference blockRef = blocks[i]; PlotData plotData = plotInfos[blockRefRegexs[i]]; psv.SetPlotConfigurationName(ps, "DWG To PDF.pc5", plotData.MediaName); Point3d minPoint = blockRef.Bounds.Value.MinPoint; Point3d maxPoint = blockRef.Bounds.Value.MaxPoint; // psv.SetPlotWindowArea(ps, new Extents2d(minPoint.X, minPoint.Y, maxPoint.X, maxPoint.Y)); psv.SetPlotType(ps, ZwSoft.ZwCAD.DatabaseServices.PlotType.Window); 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); psv.SetPlotRotation(ps, plotData.Rotate ? PlotRotation.Degrees090 : PlotRotation.Degrees000); pi.Layout = acBlkTblRec.LayoutId; LayoutManager.Current.CurrentLayout = lo.LayoutName; pi.OverrideSettings = ps; piv.Validate(pi); if (i == 0) { ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "转PDF"); //ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "取消打印"); //ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "取消当前页打印"); //ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); //ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); ppd.LowerPlotProgressRange = 0; ppd.UpperPlotProgressRange = blockCnt; ppd.PlotProgressPos = 0; ppd.OnBeginPlot(); ppd.IsVisible = true; pe.BeginPlot(ppd, null); pe.BeginDocument(pi, cadPath, null, 1, true, path); } ppd.StatusMsgString = "打印 " + System.IO.Path.GetFileName(cadPath) + " - 页 ( " + (i + 1) + " / " + blockCnt + " )"; ppd.PlotProgressPos = i; ppd.OnBeginSheet(); ppd.LowerSheetProgressRange = 0; ppd.UpperSheetProgressRange = 100; ppd.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); pe.BeginPage(ppi, pi, i == blockCnt - 1, null); pe.BeginGenerateGraphics(null); ppd.SheetProgressPos = 50; pe.EndGenerateGraphics(null); pe.EndPage(null); ppd.SheetProgressPos = 100; ppd.OnEndSheet(); } pe.EndDocument(null); ppd.PlotProgressPos = 100; ppd.OnEndPlot(); pe.EndPlot(null); ppd.Dispose(); } } Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot); tr.Commit(); } KUtil.Log("转换PDF完成"); return path; } public static string ConvertPDF(Database db, string cadPath, Dictionary plotInfos) { if (db == null) { throw new Exception("图纸DataBase不能为null"); } KUtil.Log("转PDF: " + cadPath); string path = cadPath.Substring(0, cadPath.Length - 4) + ".pdf"; KUtil.Log("PDF路径:" + path); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); List blocks; List blockRefRegexs; KCADUtil.GetBlocksByRegex(tr, db, bt, OpenMode.ForRead, out blocks, out blockRefRegexs, plotInfos.Keys.ToArray()); int blockCnt = blocks == null ? 0 : blocks.Count; KUtil.Log("找到块数量:" + blockCnt); if (blockCnt == 0) { //throw new Exception("图纸中没有找到需要打印的块"); return path; } PlotInfo pi = new PlotInfo(); PlotInfoValidator piv = new PlotInfoValidator(); piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; if (PlotFactory.ProcessPlotState != ProcessPlotState.NotPlotting) { throw new Exception("其他打印正在执行"); } short bgPlot = (short)Application.GetSystemVariable("BACKGROUNDPLOT"); Application.SetSystemVariable("BACKGROUNDPLOT", 0); using (PlotEngine pe = PlotFactory.CreatePublishEngine()) { //using (PlotProgressDialog ppd = new PlotProgressDialog(false, blockCnt, true)) { PlotSettingsValidator psv = PlotSettingsValidator.Current; StringCollection cols = psv.GetPlotStyleSheetList(); bool StyleSheetCheck = false; foreach (string s in cols) { if (string.Compare(s, "monochrome.ctb", true) == 0) { StyleSheetCheck = true; } } BlockTableRecord acBlkTblRec = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; Layout lo = (Layout)tr.GetObject(acBlkTblRec.LayoutId, OpenMode.ForRead); PlotSettings ps = new PlotSettings(lo.ModelType); ps.CopyFrom(lo); ps.PrintLineweights = true; for (int i = 0; i < blockCnt; i++) { BlockReference blockRef = blocks[i]; PlotData plotData = plotInfos[blockRefRegexs[i]]; psv.SetPlotConfigurationName(ps, "DWG To PDF.pc5", plotData.MediaName); Point3d minPoint = blockRef.Bounds.Value.MinPoint; Point3d maxPoint = blockRef.Bounds.Value.MaxPoint; // psv.SetPlotWindowArea(ps, new Extents2d(minPoint.X, minPoint.Y, maxPoint.X, maxPoint.Y)); psv.SetPlotType(ps, ZwSoft.ZwCAD.DatabaseServices.PlotType.Window); 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); psv.SetPlotRotation(ps, plotData.Rotate ? PlotRotation.Degrees090 : PlotRotation.Degrees000); pi.Layout = acBlkTblRec.LayoutId; LayoutManager.Current.CurrentLayout = lo.LayoutName; pi.OverrideSettings = ps; piv.Validate(pi); if (i == 0) { //ppd.set_PlotMsgString(PlotMessageIndex.DialogTitle, "转PDF"); ////ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "取消打印"); ////ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "取消当前页打印"); ////ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "Sheet Set Progress"); ////ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "Sheet Progress"); //ppd.LowerPlotProgressRange = 0; //ppd.UpperPlotProgressRange = blockCnt; //ppd.PlotProgressPos = 0; //ppd.OnBeginPlot(); //ppd.IsVisible = true; pe.BeginPlot(null, null); pe.BeginDocument(pi, cadPath, null, 1, true, path); } //ppd.StatusMsgString = "打印 " + System.IO.Path.GetFileName(cadPath) + " - 页 ( " + (i + 1) + " / " + blockCnt + " )"; //ppd.PlotProgressPos = i; //ppd.OnBeginSheet(); //ppd.LowerSheetProgressRange = 0; //ppd.UpperSheetProgressRange = 100; //ppd.SheetProgressPos = 0; PlotPageInfo ppi = new PlotPageInfo(); pe.BeginPage(ppi, pi, i == blockCnt - 1, null); pe.BeginGenerateGraphics(null); //ppd.SheetProgressPos = 50; pe.EndGenerateGraphics(null); pe.EndPage(null); // ppd.SheetProgressPos = 100; // ppd.OnEndSheet(); } pe.EndDocument(null); // ppd.PlotProgressPos = 100; //ppd.OnEndPlot(); pe.EndPlot(null); // ppd.Dispose(); } //} Application.SetSystemVariable("BACKGROUNDPLOT", bgPlot); tr.Commit(); } KUtil.Log("转换PDF完成"); return path; } } }