更新的任意紙張批量打印預覽
首先是e大給了我這個英文工程: https://github.com/phusband/PiaNO
然后我做了大量中文函數翻譯的工程和幾個函數的增設調改....
因為這個歪果仁更新已經過了很久了,而且中文也不宜和純英文工程合並..
所以我另建了一個工程,上傳了這個項目到github,
請去此下載: https://github.com/jingjingbox/-_PianoCN
利用pianoCN現在可以讀改 PC3,STB,CTB三種格式的文件.
注意引用了相關的NuGet
2008的pc3翻譯....

meta{ 關聯到PMP的位置 user_defined_model_pathname=" 用戶定義的模型庫名稱user_defined_model_basename=" 驅動程序路徑名 driver_pathname="C:\Program Files (x86)\AutoCAD 2008\drv\gdiplot9.hdi 驅動程序版本 driver_version="1.1-9.1.51.0 驅動標簽線 driver_tag_line ="Windows 系統驅動程序 - 由 Autodesk 提供 工具包版本 toolkit_version=1 驅動程序類型 driver_type=1 規范家庭名稱 canonical_family_name="System 先顯示自定義 show_custom_first=TRUE 類型是文本 truetype_as_text=TRUE 規范模型名稱 canonical_model_name="System 本地家庭名稱 localized_family_name="系統 本地模型名稱 localized_model_name="系統 只有文件 file_only=FALSE 模型能力 model_abilities="555555555055 UDM描述 udm_description=" 視窗系統設備名稱 win_device_name="pdfFactory Pro 視窗系統設備名稱 win_driver_name= "pdfFactory 6 短的網絡名稱 short_net_name="pdfFactory Pro 友好的網絡名稱 friendly_net_name="FPP6: dm驅動程序版本 dm_driver_version=1555 默認系統配置(猜測是從系統繼承打印機) default_system_cfg=FALSE 平台 platform ="2,6,1 地區 locale="4B00409 } mod{ media{ 能力 abilities="100004455400144444000005005005000400000000000005000 狀態 caps_state caps="00000 擁有人 ui_owner="22212222121111212112221 紙張最大的規格的x size_max_x=914.40002441 ( 0#.3C$ &E@) 紙張最大的規格的y size_max_y=1219.2000732 ( X,P,DT 5'@) description{ 0{ caps_type=1 name="ISO_A4_Portrait_210.00W_x_297.00H_-_(5,_17)_x_(205,_280)_=52600_MM media_bounds_urx=210.0 media_bounds_ury=297.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=210.0 printable_bounds_ury=297.0 printable_area=62370.0 dimensional=TRUE } //其他的都是每個紙張的信息 1{ caps_type=1 name="ISO_A4_Landscape_297.00W_x_210.00H_-_(5,_17)_x_(292,_193)_=50512_MM media_bounds_urx=297.0 media_bounds_ury=210.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=297.0 printable_bounds_ury=210.0 printable_area=62370.0 dimensional=TRUE } 2{ caps_type=1 name="ISO_A3_Portrait_297.00W_x_420.00H_-_(5,_17)_x_(292,_403)_=110782_MM media_bounds_urx=297.0 media_bounds_ury=420.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=297.0 printable_bounds_ury=420.0 printable_area=124740.0 dimensional=TRUE } 3{ caps_type=1 name="ISO_A3_Landscape_420.00W_x_297.00H_-_(5,_17)_x_(415,_280)_=107830_MM media_bounds_urx=420.0 media_bounds_ury=297.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=420.0 printable_bounds_ury=297.0 printable_area=124740.0 dimensional=TRUE } 4{ caps_type=1 name="ISO_A2_Portrait_420.00W_x_594.00H_-_(5,_17)_x_(415,_577)_=229600_MM media_bounds_urx=420.0 media_bounds_ury=594.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=420.0 printable_bounds_ury=594.0 printable_area=249480.00000 ( $!T#D$:G ) dimensional=TRUE } 5{ caps_type=1 name="ISO_A2_Landscape_594.00W_x_420.00H_-_(5,_17)_x_(589,_403)_=225424_MM media_bounds_urx=594.0 media_bounds_ury=420.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=594.0 printable_bounds_ury=420.0 printable_area=249480.00000 ( $!T#D$:G ) dimensional=TRUE } 6{ caps_type=1 name="ISO_A1_Portrait_594.00W_x_841.00H_-_(5,_17)_x_(589,_824)_=471288_MM media_bounds_urx=594.0 media_bounds_ury=841.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=594.0 printable_bounds_ury=841.0 printable_area=499554.00000 ( (A]'D&X?P) dimensional=TRUE } 7{ caps_type=1 name="ISO_A1_Landscape_841.00W_x_594.00H_-_(5,_17)_x_(836,_577)_=465360_MM media_bounds_urx=841.0 media_bounds_ury=594.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=841.0 printable_bounds_ury=594.0 printable_area=499554.00000 ( (A]'D&X?P) dimensional=TRUE } 8{ caps_type=1 name="ISO_expand_A1_Portrait_594.00W_x_841.00H_-_(5,_10)_x_(589,_831)_=479464_MM media_bounds_urx=594.0 media_bounds_ury=841.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=594.0 printable_bounds_ury=841.0 printable_area=499554.00000 ( (A]'D&X?P) dimensional=TRUE } 9{ caps_type=1 name="ISO_expand_A1_Landscape_841.00W_x_594.00H_-_(5,_10)_x_(836,_584)_=476994_MM media_bounds_urx=841.0 media_bounds_ury=594.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=841.0 printable_bounds_ury=594.0 printable_area=499554.00000 ( (A]'D&X?P) dimensional=TRUE } 10{ caps_type=1 name="ISO_A0_Portrait_841.00W_x_1189.00H_-_(5,_17)_x_(836,_1172)_=959805_MM media_bounds_urx=841.0 media_bounds_ury=1189.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=841.0 printable_bounds_ury=1189.0 printable_area=999949.00000 ( !J$+D$QEP) dimensional=TRUE } 11{ caps_type=1 name="ISO_expand_A0_Portrait_841.00W_x_1189.00H_-_(5,_10)_x_(836,_1179)_=971439_MM media_bounds_urx=841.0 media_bounds_ury=1189.0 printable_bounds_llx=0.0 printable_bounds_lly=0.0 printable_bounds_urx=841.0 printable_bounds_ury=1189.0 printable_area=999949.00000 ( !J$+D$QEP) dimensional=TRUE } } } } del{ media{ abilities="100004455400144444000005005005000400000000000005000 caps_state ="00000 ui_owner="22212222121111212112221 size_max_x =914.40002441 ( 0#.3C$ &E@) size_max_y=1219.2000732 ( X,P,DT 5'@) } } udm{ calibration{ _x=1.0 _y=1.0 } media{ abilities="100004455400144444000005005005000400000000000005000 caps_state="00000 ui_owner="22212222121111212112221 size_max_x=914.40002441 ( 0#.3C$ &E@) size_max_y=1219.2000732 ( X,P,DT 5'@) } } hidden{ media{ abilities="04455400144444000005005005000400000000000005000 caps_state="00000 ui_owner="22212222121111212112221 size_max_x=914.40002441 ( 0#.3C$ &E@) size_max_y=1219.2000732 ( X,P,DT 5'@) } }
2019的pc3翻譯...

meta{ 關聯到PMP的位置 user_defined_model_pathname="G:\K01.驚驚連盒\04.工作小工具\2019dwgToPdf打印機\DWG To PDF.pmp 用戶定義的模型庫名稱user_defined_model_basename=" 驅動程序路徑名 driver_pathname="C:\Program Files\Autodesk\AutoCAD 2019\drv\pdfplot15.hdi 驅動程序版本 driver_version="1.1-15.0.61.0 [v018-1] [v018-1] 驅動標簽線 driver_tag_line="PDF ePlot - by Autodesk 工具包版本 toolkit_version=1 驅動類型 driver_type=3 規范家庭名稱 canonical_family_name="Autodesk ePlot 先顯示自定義 show_custom_first=FALSE 以文本形式輸入 truetype_as_text=TRUE 規范模型名稱 canonical_model_name="pdf 本地家庭名稱 localized_family_name="Autodesk ePlot (PDF) 本地模型名稱 localized_model_name="DWG To PDF 是否打印到文件(false就是后台打印?) file_only=TRUE 模型能力 model_abilities="000550055000 udm描述 udm_description=" 短的網絡名稱 short_net_name=" 友好的網絡名稱 friendly_net_name=" dm驅動程序版本 dm_driver_version=0 默認系統配置(猜測是從系統繼承打印機) default_system_cfg=FALSE 平台 platform="2,10,0 地區 locale="4B0040 配置說明 config_description=" 配置自動線軸 config_autospool=FALSE } media{ 選擇方法 selection_method=2 類型 type=" dm方向 dm_orientation=1 實際打印x邊界偏移 actual_printable_bounds_llx=0.0 實際打印y邊界偏移 actual_printable_bounds_lly=0.0 實際打印x邊界范圍 actual_printable_bounds_urx=210.0 實際打印y邊界范圍 actual_printable_bounds_ury=297.0 份數副本 number_of_copies=1 size{ name="ISO_A4_(210.00_x_297.00_MM) group=4 情景模式 landscape_mode=FALSE 長打印_減少 longplot_reduction=1.0 媒介描述 media_description{ 實際打印x邊界偏移 printable_bounds_llx=5.0 實際打印y邊界偏移 printable_bounds_lly=17.0 實際打印x邊界范圍 printable_bounds_urx=205.0 實際打印y邊界范圍 printable_bounds_ury=280.0 實際打印面積 printable_area=52600.0 尺寸的 dimensional=TRUE 媒介界限 media_bounds{ 紙張范圍 urx=210.0 紙張范圍 ury=297.0 } } } } io{ type=2 pathname=" allsysvalid=FALSE plot_to_file=TRUE } res_color_mem{ name="RGB num_colors=16777216 color_depth=24 num_undithered_colors=16777216 color_system=1 dm_color=1 lines_overwrite=TRUE resolution{ name="Default phys_resolution_x=600.0 phys_resolution_y=600.0 addr_resolution_x=1.0 addr_resolution_y=1.0 effective_resolution_x=600.0 effective_resolution_y=600.0 } } custom{ 0{ name="Create_Bookmarks value=TRUE } 1{ name="Thumbnail_Title value=TRUE } 2{ name="Sheet_Links value=TRUE } 3{ name="Rasterize_Geometry value=FALSE } 4{ name="View_New_File value=TRUE } 5{ name="Custom_Raster_Resolution value=FALSE } 6{ name="Custom_DWF_Resolution value=FALSE } 7{ name="Custom_Monochrome_Resolution value=FALSE } 8{ name="Custom_Gradient_Resolution value=FALSE } 9{ name="Gradient_Limit value=600 } 10{ name="Monochrome_Raster_Limit value=400 } 11{ name="Raster_Limit value=400 } 12{ name="All_As_Geometry value=FALSE } 13{ name="Capture value=2 } 14{ name="Font_Capture value=TRUE } 15{ name="Hardcopy_Resolution value=600 } 16{ name="Include_Layer value=TRUE } 17{ name="Resolution value=14 } }
20191229更新:
我做的批量打印都是基於Acad2019的,因為2019的<dwg to pdf>打印機打印出來的東西比PdfFactory和低版本的要清晰和文件小.
之前挖的坑是沒有修改pmp的方法,現在給工程出來了,而且這次更新主要的目的是提供任意紙張大小的方法:修改pmp文件..
但是還是有很多東西需要說明一下.
批量打印不可以用模態對話框,打印預覽的時候會卡死.所以要用非模態的.
(這個是我實現成功的方式,但是不一定要非模態,或許有其他方法處理就可以了....)
打開pmp文件之后的修改注意事項
[pmp]注意事項: 不能改: 系統紙張數量 系統紙張的名稱 只能改: 系統紙張邊界范圍,在 mod:description下 用戶紙張的大小 ,在 udm:添加size,添加description [pmp]解析: mod:media:size: 本地中文名稱和英文名稱對照表 mod:media:description: 是紙張大小和紙張邊界的描述--這里就是修改紙張大小 del: 估計是刪除紙張的.. udm: 用戶定義的紙張 hidden:隱藏紙張,主要作用是手選打印的時候可以不顯示那么多紙張. [pmp]用戶表解析: udm{ 這里就是用戶定義的 size{ 中英對換表 0{ caps_type=2 name="UserDefinedMetric (2222.00 x 2222.00毫米) localized_name="用戶 1 (2222.00 x 2222.00 毫米) 這里文字可以隨便寫的 media_description_name="UserDefinedMetric 橫向 2222.00W x 2222.00H - (5, 4) x (2215, 2218) =4896479 毫米 media_group=15 landscape_mode=TRUE } } description{ 紙張信息表,注意所有的小數點存在 0{ caps_type=2 name="UserDefinedMetric 橫向 2222.00W x 2222.00H - (5, 4) x (2215, 2218) =4896479 毫米 media_bounds_urx=2222.0 media_bounds_ury=2222.0 printable_bounds_llx=5.0999999046 //注意所有的小數點必須存在 printable_bounds_lly=4.0999999046 //注意所有的小數點必須存在 printable_bounds_urx=2215.8999023 //注意所有的小數點必須存在 printable_bounds_ury=2218.8999023 //注意所有的小數點必須存在 printable_area=4896479.8408 dimensional=TRUE } } [我的pmp設置] 我在2019 dwgToPdf打印機先 恢復了-默認值,再-過濾圖紙尺寸, 然后剩下A0 A1 A2 A3 A4 去掉邊界值,這一步就可以手動打印無邊了. ISO A0 (841.00 x 1189.00 毫米) 建議用 ISO_expand_A0_(841.00_x_1189.00_MM) 這種cad2008用這種紙張會有邊界靠左的問題,2019就沒有問題. 修改紙張的邊界偏移的時候, 左推到右:圖形會以右邊中點進行等比縮放, 下推到上:圖形會以上邊中點進行等比縮放, 然后此時要重設圖形原點.否則圖紙是偏的.
可以用pc3生成pmp文件,這樣pmp是臨時的,你在上面加(用戶)圖紙和減(用戶)圖紙,就可以打不定邊長的圖紙辣~~~~~~~~~~~~~~
修改pc3和pmp上面的路徑.這里就是提供一個方法給大家修改節點屬性的方法

#if AC2019 using PiaNO; #endif using System.IO; namespace JoinBox.批量打印 { public static class Pc3PmpChange { public const string DTP = "DWG TO PDF.PC3"; /// <summary> /// 附着pmp路徑到pc3內 /// </summary> /// <param name="plotDevice">當前調用的打印機</param> /// <param name="dwgtopdfpmp">pmp路徑</param> public static void ChangUserDefinedModel(string plotDevice, string dwgtopdfpmp) { #if AC2019 //獲取這個打印機的完整路徑 string printerConfigDir = CadSystem.Getvar("PrinterConfigDir") + "\\" + DTP; var ns = new string[] { printerConfigDir, dwgtopdfpmp }; foreach (var path in ns) { if (!File.Exists(path)) { continue; } var PdfConfig = new PlotterConfiguration(path); //解壓了打印機信息之后,遍歷打印機節點 foreach (var nodeA in PdfConfig) { if (nodeA.NodeName == "meta") { nodeA.ValueChang("user_defined_model_pathname" + "_str", dwgtopdfpmp); break; } } PdfConfig.Saves(); } #endif } } }
添加紙張

/// <summary> /// 根據范圍帶下生成紙張,返回紙張名稱 /// </summary> /// <param name="ext">打印范圍</param> /// <param name="dwgtopdfpmp">打印機pmp紙張文件路徑</param> /// <returns></returns> public PlotterConfiguration AddPrinter(string dwgtopdfpmp) { Name = $"JBS_PDF_({PaperY.ToString("#0.00")}_x_{PaperX.ToString("#0.00")}_MM)"; // JoinBoxStandard 嘻嘻 // (5,_17)這個是默認偏移量 // media_description_name="ISO_A0_Portrait_841.00W_x_1189.00H_-_(5,_17)_x_(836,_1172)_=959805_MM //實際打印面積(雖然因為偏移值是0,等於長乘寬就可以,但是為了日后我忘記這里怎么算的,還是求一下吧) double area = (PaperY - (Offset_Left * 2)) * (PaperX - (Offset_Down * 2)); //如果沒有小數點保留,可能cad閃退! StringBuilder description_name = new StringBuilder(); description_name.Append($"JBS_PDF_Portrait_{PaperY.ToString("#0.00")}W_x_{PaperX.ToString("#0.00")}H"); description_name.Append("_-_"); description_name.Append($"({Offset_Left.ToString("#0.00")},_{Offset_Down.ToString("#0.00")})");//偏移量 description_name.Append("_x_"); description_name.Append($"({(PaperY - Offset_Left).ToString("#0.00")},_{(PaperX - Offset_Down).ToString("#0.00")})_"); description_name.Append($"={area.ToString("#0.00")}_MM"); Media_description_name = description_name.ToString(); PdfConfig = new PlotterConfiguration(dwgtopdfpmp) { TruetypeAsText = true }; //解壓了打印機信息之后,遍歷打印機節點 foreach (var nodeA in PdfConfig) { if (nodeA.NodeName == "udm") { foreach (var nodeB in nodeA) { if (nodeB.NodeName == "media") { PiaNode piaNode_size = null; PiaNode piaNode_description = null; //遍歷是否有節點 foreach (PiaNode nodeC in nodeB) { string nden = nodeC.NodeName; switch (nden) { case str_size: piaNode_size = nodeC; break; case str_description: piaNode_description = nodeC; break; } } //找不到就添加節點 if (piaNode_size == null) { piaNode_size = nodeB.Add(str_size); } if (piaNode_description == null) { piaNode_description = nodeB.Add(str_description); } //在節點中添加/修改信息 AddPaperEnAndCn(piaNode_size); AddPaperDescription(piaNode_description); break; } } break; } } PdfConfig.Saves(); return PdfConfig; } /// <summary> /// 添加pmp紙張-中英對換表 /// </summary> /// <param name="nodeC"></param> private void AddPaperEnAndCn(PiaNode nodeC) { //圖紙數量+1就是新建一張圖 var spl = '\n'; int count = nodeC.Count(); string name = count.ToString(); string[] paper = new string[] { name+ "{", $"caps_type=2", //1是系統的,2是用戶的.這里嚴格,可不可以在打印紙看見就是這里了 $"name=\"{Name}", $"localized_name=\"{Localized_name}", $"media_description_name=\"{Media_description_name}", $"media_group=15", //4是系統的,15是用戶的. "landscape_mode=TRUE\n}", //false是系統的,true是用戶的 }; string paperAll = string.Join(spl + " ", paper) + spl; PlusNode(nodeC, name, paperAll); } /// <summary> /// 判斷是否已有同名節點,有就不加入 /// </summary> /// <param name="nodeC"></param> /// <param name="name"></param> /// <param name="paperAll"></param> private void PlusNode(PiaNode nodeC, string name, string paperAll) { bool yiyou = true; foreach (var nodeD in nodeC) { foreach (var pair in nodeD.Values) { if (pair.Key == "media_description_name_str" && pair.Value == Media_description_name) { yiyou = false; break; } } if (!yiyou) { break; } } if (yiyou) { nodeC.Add(name, paperAll); } } /// <summary> /// 添加pmp紙張-信息 /// </summary> /// <param name="nodeC"></param> private void AddPaperDescription(PiaNode nodeC) { var spl = '\n'; int count = nodeC.Count(); string name = count.ToString(); string[] paper = new string[] { name + "{", $"caps_type=2", //1是系統的,2是用戶的.這里嚴格,可不可以在打印紙看見就是這里了 $"name=\"{Media_description_name}", $"media_bounds_urx={ChangDouble(PaperX)}", $"media_bounds_ury={ChangDouble(PaperY)}", $"printable_bounds_llx={ChangDouble(Offset_Left)}", $"printable_bounds_lly={ChangDouble(Offset_Down)}", $"printable_bounds_urx={ChangDouble(PaperX)}", $"printable_bounds_ury={ChangDouble(PaperY)}", $"printable_area={ChangDouble(PaperX * PaperY)}", "dimensional=TRUE\n}", }; string paperAll = string.Join(spl + " ", paper) + spl; PlusNode(nodeC, name, paperAll); } /// <summary> /// 保證數字在12位內 /// </summary> /// <param name="dos"></param> /// <returns></returns> string ChangDouble(double dos) { var str = string.Format("{0:0.0#########}", dos); if (str.Length >= 12) { return str.Substring(0, 12); } return str; }
刪除紙張的方法

public static class PrinterTool { /// <summary> /// 移除圖紙 /// </summary> /// <param name="dwgtopdfpmp">pmp名稱</param> /// <param name="printerNames">要移除的紙張名稱</param> public static void RemovePrinters(this Plot plot, string dwgtopdfpmp, string[] printerNames, Database db, Transaction tr) { var pdfConfig = new PlotterConfiguration(dwgtopdfpmp) { TruetypeAsText = true }; pdfConfig.RemovePrinters(printerNames); pdfConfig.Saves(); //然后需要刷新一次打印機設備紙張,不然會有殘留顯示 var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead, false) as BlockTable; foreach (ObjectId btrId in bt) { var btr = tr.GetObject(btrId, OpenMode.ForRead, false) as BlockTableRecord; if (btr.IsLayout)//是布局才進入 { Layout layout = tr.GetObject(btr.LayoutId, OpenMode.ForRead) as Layout; var ps = new PlotSettings(layout.ModelType); plot.RefreshLists(ps); } } } /// <summary> /// 移除圖紙 /// </summary> /// <param name="pdfConfig">pmp的解析</param> /// <param name="printerNames">要移除的紙張名稱</param> static void RemovePrinters(this PlotterConfiguration pdfConfig, string[] printerNames) { //解壓了打印機信息之后,遍歷打印機節點 foreach (var nodeA in pdfConfig) { if (nodeA.NodeName == "udm") { foreach (var nodeB in nodeA) { if (nodeB.NodeName == "media") { //遍歷是否有節點 foreach (PiaNode nodeC in nodeB) { switch (nodeC.NodeName) { case Printer.str_size: case Printer.str_description: { nodeC.RemoveChildNodes(printerNames); } break; } } break; } } break; } } } }