在我前面很多關於Visio的開發過程中,介紹了各種Visio的C#開發應用場景,包括對Visio的文檔、模具文檔、形狀、屬性數據、各種事件等相關的基礎處理,以及Visio本身的整體項目應用,雖然時間過去很久,不過這些技術依舊還在使用中,最近應客戶培訓的需要,我對所有的內容進行了重新整理,把一些沒有介...
在我前面很多關於Visio的開發過程中,介紹了各種Visio的C#開發應用場景,包括對Visio的文檔、模具文檔、形狀、屬性數據、各種事件等相關的基礎處理,以及Visio本身的整體項目應用,雖然時間過去很久,不過這些技術依舊還在使用中,最近應客戶培訓的需要,我對所有的內容進行了重新整理,把一些沒有介紹的很詳細或者很少的內容進行了豐富,因此本文介紹的主題-Visio二次開發之文件導出及另存Web頁面,介紹一下Visio文件另存為其他幾種格式的處理,以及另存為Web文件等相關操作。
1、Visio導出為PDF格式
在一般情況下,PDF格式是較為常用的內容格式,因此Visio文檔(Vsd格式)導出為PDF也是很常見的一件事情,Office文檔本身很好支持PDF格式的輸出,因此對於Visio來說,也不是什麼難事,基本上利用它現有的API就可以導出為PDF格式了。
在Visio的Document文檔對象中,就有ExportAsFixedFormat這個方法,可以導出為PDF或者XPS的格式的,這個格式有很多參數,用來確定導出那頁,以及格式等設置。
expression.ExportAsFixedFormat(FixedFormat, OutputFileName, Intent, PrintRange, FromPage, ToPage, ColorAsBlack, IncludeBackground, IncludeDocumentProperties, IncludeStructureTags, UseISO19005_1, FixedFormatExtClass)
同時,這些參數的相關說明如下所示。
Name | Required/Optional | Data Type | Description |
---|---|---|---|
FixedFormat | Required | VisFixedFormatTypes | The format type in which to export the document. See Remarks for possible values. |
OutputFileName | Optional | String | The name and path of the file to which to output, enclosed in quotation marks. |
Intent | Required | VisDocExIntent | The output quality. See Remarks for possible values. |
PrintRange | Required | VisPrintOutRange | The range of document pages to be exported. See Remarks for possible values. |
FromPage | Optional | Long | If PrintRange is visPrintFromTo , the first page in the range to be exported. The default is 1, which indicates the first page of the drawing. |
ToPage | Optional | Long | If PrintRange is visPrintFromTo , the last page in the range to be exported. The default is -1, which indicates the last page of the drawing. |
ColorAsBlack | Optional | Boolean | True to render all colors as black to ensure that all shapes are visible in the exported drawing. False to render colors normally. The default is False. |
IncludeBackground | Optional | Boolean | Whether to include background pages in the exported file. The default is True. |
IncludeDocumentProperties | Optional | Boolean | Whether to include document properties in the exported file. The default is True. |
IncludeStructureTags | Optional | Boolean | Whether to include document structure tags to improve document accessibility. The default is True. |
UseISO19005_1 | Optional | Boolean | Whether the resulting document is compliant with ISO 19005-1 (PDF/A). The default is False. |
FixedFormatExtClass | Optional | [UNKNOWN] | A pointer to a class that implements the IMsoDocExporter interface for purposes of creating custom fixed output. The default is a null pointer. |
我們在代碼裡面導出PDF如下所示。
SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = ""; dlg.Filter = "Pdf文件 (*.pdf)|*.pdf|AutoCAD 繪圖 (*.dwg)|*.dwg|所有文件(*.*)|*.*"; dlg.FilterIndex = 1; if (dlg.ShowDialog() == DialogResult.OK) { if (dlg.FileName.Trim() != string.Empty) { VisDocument.ExportAsFixedFormat(Visio.VisFixedFormatTypes.visFixedFormatPDF, dlg.FileName, Visio.VisDocExIntent.visDocExIntentScreen, Visio.VisPrintOutRange.visPrintAll, 1, VisDocument.Pages.Count, false, true, true, true, true, System.Reflection.Missing.Value); } }
這樣,我們通過指定PDF格式,以及導出文件名,以及起止頁碼等信息後,就可以順利導出對應的Visio文檔了,這種方式導出的Visio文檔,效果非常好,可以放大到最大清晰都很好的。
2、Visio另存為CAD格式
Visio和CAD之間是比較好的相容模式的,Visio和CAD本身都是基於矢量圖形的繪製,因此轉換為CAD在繼續進行編輯也是很常見的事情,因此在較早時期,Visio本身就對CAD格式(dwg格式)就提供了很好的支持,它可以通過下麵代碼進行CAD格式的導出。
SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = ""; dlg.Filter = "AutoCAD 繪圖 (*.dwg)|*.dwg|所有文件(*.*)|*.*"; dlg.FilterIndex = 1; if (dlg.ShowDialog() == DialogResult.OK) { if (dlg.FileName.Trim() != string.Empty) { VisApplication.ActivePage.Export(dlg.FileName); } }
如果CAD文件順利導出,那麼會有一個日誌文件提示用戶操作的結果的,如下所示。
Visio還可以導出為JPG格式,這個和CAD操作類似,都是通過Page對象的Export方法進行導出,操作代碼如下所示。
SaveFileDialog dlg = new SaveFileDialog(); dlg.FileName = ""; dlg.Filter = "JPEG文件 (*.jpg)|*.jpg|所有文件(*.*)|*.*"; dlg.FilterIndex = 1; if (dlg.ShowDialog() == DialogResult.OK) { if (dlg.FileName.Trim() != string.Empty) { VisApplication.ActivePage.Export(dlg.FileName); } }
雖然這個導出的JPG格式,也是比較不錯的,不過相對PDF的矢量效果來說,JPG放大的話,一般來說沒有PDF格式那麼清晰,但總體效果也還是可以。
3、Visio文檔另存Web頁面
對於Visio文檔的另存為Web頁面的操作,就沒有上述幾個方法那麼簡單了,一般需要更加複雜一點的處理方式。
雖然對於Visio文檔來說,在IE上可以通過ActiveX的Visio Viewer來進行查看,不過其他瀏覽器都不支持,因此對於另存為Web頁面的文件,這種方式顯得比較通用一些,可以在各個瀏覽器上查看HTML頁面,裡面就包含了對Visio文件的顯示了。
Visio的文檔另存為Web頁面的操作,主要思路是利用Application對象的SaveAsWebObject屬性,並通過VisWebPageSettings對象進行一些導出屬性的設置,如頁面範圍,文檔解析度等屬性設置,以及是否在完成後使用瀏覽器打開文件等設置。
如獲得對象的操作如下所示。
// 獲取文檔的Application對象 targetApplication = targetDocument.Application; // 獲取並轉換SaveAsWebObject對象 saveAsWebAddon = (VisSaveAsWeb)targetApplication.SaveAsWebObject; // 獲取保存Web頁面的參數設置對象 saveAsWebSetting = (VisWebPageSettings)saveAsWebAddon.WebPageSettings;
通過獲得頁面參數對象,我們可以設定導出的起始頁面,如下所示。
saveAsWebSetting.StartPage = startPage;
saveAsWebSetting.EndPage = endPage;
然後在綁定到具體導出的文檔裡面就確定對應導出的文檔了。
//使用AttachToVisioDoc指定那個文檔作為保存頁面的對象 saveAsWebAddon.AttachToVisioDoc(targetDocument);
為了提高導出Web頁面的Visio清晰度,我們需要設置文檔的顯示比例,如下所示為使用源格式大小。
//設置其中的相關參數 saveAsWebSetting.DispScreenRes = VISWEB_DISP_RES.resSource;//顯示比例
這個VISWEB_DISP_RES裡面有很多參數可以設置的。
Constant | Value | Description |
---|---|---|
resSource |
0 |
Use resolution of the source image for output. |
res180x260 |
1 |
180 x 260 pixels |
res544x376 |
2 |
544 x 376 pixels |
res640x480 |
3 |
640 x 480 pixels |
res720x512 |
4 |
720 x 512 pixels |
res768x1024 |
5 |
768 x 1024 pixels |
res800x600 |
6 |
800 x 600 pixels |
res1024x768 |
7 |
1024 x 768 pixels |
res1152x882 |
8 |
1152 x 882 pixels |
res1152x900 |
9 |
1152 x 900 pixels |
res1280x1024 |
10 |
1280 x 1024 pixels |
res1600x1200 |
11 |
1600 x 1200 pixels |
res1800x1440 |
12 |
1800 x 1440 pixels |
res1920x1200 |
13 |
1920 x 1200 pixels |
resINVALID |
14 |
Reserved. |
另外還有一個參數確定是批處理方式(靜默方式)還是完成後通過瀏覽器打開文件的方式,如下所示。
//判斷是否為批處理模式 if ((flags & RunInBatchMode) != 0) { // 如果為批處理模式,那麼瀏覽器視窗不會自動打開 saveAsWebSetting.OpenBrowser = 0; saveAsWebSetting.SilentMode = 1; } else { // 否則保存完畢後打開對應給的瀏覽器顯示文件 saveAsWebSetting.OpenBrowser = 1; saveAsWebSetting.QuietMode = 1; }
如果一切順利,那麼通過方法直接創建頁面就可以了,如下所示。
saveAsWebAddon.CreatePages();// 創建頁面
以上的方法處理,我們一般封裝在一個類裡面,方便調用處理,那麼在界面上,我們處理的方法就可以簡單化一些。
var fileName = System.IO.Path.Combine(System.Environment.CurrentDirectory, "test.html"); var success = SaveAsWebApi.SaveDocAsWebPage(this.axDrawingControl1.Document, -1, -1, fileName, SaveAsWebApi.ShowPropertiesWindow | SaveAsWebApi.ShowNavigationBar | SaveAsWebApi.ShowSearchTool | SaveAsWebApi.ShowPanAndZoom); MessageBox.Show(success ? "成功生成Web文件" : "生成Web文件操作失敗");
最後,我們就可以在各個瀏覽器裡面查看相關的Visio文件了,這種方式比Visio Viewer的處理更通用,效果也很不錯哦。