在 WinForm 應用程式中直接顯示 PDF 檔案,最簡單的方式是使用 Adobe Acrobat 提供的 ActiveX 控制項 AxAcroPDF。本文說明從工具箱加入元件到程式碼開啟檔案的完整流程。
AxAcroPDF 控制項圖示。前提條件: 開發機與使用者電腦皆需安裝 Adobe Acrobat Reader DC 或更新版本。
從工具箱將 AxAcroPDF 拉到表單上,Visual Studio 會自動產生 AxAcroPDFLib 與 AcroPDFLib 參考,並在表單上建立名為 axAcroPDF1 的控制項實例。
private void btnOpenPdf_Click(object sender, EventArgs e)
{
using (var ofd = new OpenFileDialog())
{
ofd.Filter = "PDF 檔案|*.pdf";
ofd.Title = "選擇要開啟的 PDF 檔案";
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
// 方法一:直接指定 src 屬性(支援本機路徑與 URL)
axAcroPDF1.src = ofd.FileName;
// 方法二:使用 LoadFile(僅限本機檔案,較舊版本相容)
// axAcroPDF1.LoadFile(ofd.FileName);
}
catch (Exception ex)
{
MessageBox.Show($"開啟 PDF 失敗:{ex.Message}", "錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
| 問題 | 原因 | 解決方式 |
|---|---|---|
| 工具箱找不到 Adobe PDF Reader | 電腦未安裝 Acrobat Reader,或版本不支援 ActiveX | 安裝最新版 Adobe Acrobat Reader DC;或改用純 .NET 程式庫(如 PdfiumViewer、PdfSharp) |
| 部署後客戶端顯示「無法建立 ActiveX 元件」 | 客戶端未安裝 Reader,或註冊表遺漏 | 安裝部署專案加入 Reader 必要條件;或改用無相依性的 .NET PDF 檢視器 |
| PDF 顯示空白/灰底 | 檔案路徑含中文/特殊字元、或檔案損毀 | 使用 Uri.EscapeDataString 處理路徑;嘗試 LoadFile 方法 |
| 高 DPI 螢幕模糊 | ActiveX 控制項不支援 Per-Monitor DPI | 在 app.manifest 設定 dpiAware;或改用 WPF + PdfiumViewer |
| 無法列印/另存新檔 | 控制項預設工具列可能被隱藏 | 設定 axAcroPDF1.setShowToolbar(true) 顯示工具列 |
// 設定檢視模式
axAcroPDF1.setView("FitH"); // 適合寬度
axAcroPDF1.setView("FitV"); // 適合高度
axAcroPDF1.setView("Fit"); // 適合頁面
axAcroPDF1.setZoom(100); // 100% 縮放
// 隱藏/顯示工具列
axAcroPDF1.setShowToolbar(false);
// 取得總頁數
int pageCount = axAcroPDF1.getPageCount();
// 跳轉頁碼
axAcroPDF1.setCurrentPage(5); // 0-based 索引
// 列印(需使用者確認)
axAcroPDF1.printWithDialog();
// 關閉檔案釋放資源
axAcroPDF1.src = "";
若專案需跨平台、無相依性、或支援高 DPI/觸控,建議改用純 .NET 程式庫:
PdfSharp.WPF 在 WPF 中原生顯示,適合新專案。掌握 AxAcroPDF 基本用法可快速滿足簡單需求;長期專案建評估現代 .NET PDF 檢視器以獲得更好體驗與維護性。