Visio 文件列印是二次開發常見需求。Document.PrintOut 提供多種列印模式,搭配 Page.Picture 屬性可實現預覽,但需處理 IPictureDisp 轉換與頁邊距單位換算等細節。
| 常數 | 值 | 說明 |
|---|---|---|
| visPrintAll | 0 | 列印所有前景頁面 |
| visPrintFromTo | 1 | 列印指定頁碼範圍 |
| visPrintCurrentPage | 2 | 列印當前作用中頁面 |
| visPrintSelection | 3 | 列印選取內容 |
| visPrintCurrentView | 4 | 列印目前視窗可見區域 |
// 列印全部頁面
visPage.Document.PrintOut(VisPrintOutRange.visPrintAll, 1, 1, false, "", false, visPage.Name, 1, false, false);
// 列印選取內容(需先確認有選取項目)
visPage.Document.PrintOut(VisPrintOutRange.visPrintSelection, 1, 1, false, "", false, visPage.Name, 1, false, false);
需列印大頁面的特定區域時:
Page.Picture (IPictureDisp) 轉為 Image 物件。Graphics.DrawImage 指定來源矩形 srcRect 與目標矩形 destRect 繪製局部。Rectangle srcRect = new Rectangle(dblLeft, dblTop, visioImage.Width/2, visioImage.Height/2);
e.Graphics.DrawImage(visioImage, destRect, srcRect, GraphicsUnit.Pixel);
需建立繼承 AxHost 的轉換器:
public class AxHostConverter : AxHost {
private AxHostConverter() : base("") { }
static public Image PictureDispToImage(stdole.IPictureDisp pictureDisp) {
return GetPictureFromIPicture(pictureDisp);
}
}
// 使用
pictureBox1.Image = AxHostConverter.PictureDispToImage(this.visPage.Picture);
PageSetupDialog 的預設單位是 ThousandthsOfAnInch,顯示時需轉為 HundredthsOfAMillimeter,確認後再轉回,否則會出現數值遞減異常:
PageSetupDialog dlg = new PageSetupDialog();
dlg.Document = printDoc;
dlg.PageSettings.Margins = PrinterUnitConvert.Convert(
dlg.PageSettings.Margins,
PrinterUnit.ThousandthsOfAnInch,
PrinterUnit.HundredthsOfAMillimeter);
if (dlg.ShowDialog() == DialogResult.OK) { /* 使用者確認 */ }
else {
// 取消時還原單位
dlg.PageSettings.Margins = PrinterUnitConvert.Convert(
dlg.PageSettings.Margins,
PrinterUnit.HundredthsOfAMillimeter,
PrinterUnit.ThousandthsOfAnInch);
}
掌握以上技巧,即可在 Visio 二次開發中實現專業級的列印與預覽功能。