Adobe Acrobat/Reader 提供 ActiveX 控件 (pdf.ocx / AcroPDF.dll) 供應用程式內嵌 PDF 檢視。本文詳細說明新舊版本控件的差異、自動化元件驅動類產生、控件建立與常用方法調用全流程。
| 版本 | 控件檔案 | ProgID / CLSID | 整合方式 |
|---|---|---|---|
| 4.x 及之前 | pdf.ocx | 完整類型庫 | 標準 ActiveX 導入:專案加入控件 → 產生 Wrapper 類 |
| 5.x / 6.x | pdf.ocx | 缺少類型庫 | CWnd::CreateControl + IDispatch + 類型庫產生 COleDispatchDriver |
| 7.x+ | AcroPDF.dll | 完整類型庫 | 同 5.x/6.x 流程,ProgID 為 AcroPDF.PDF.1 |
ActiveX\pdf.tlb_DPdf 類 (對應 IPDF 介面),頭文件 pdf.h#include "pdf.h"
class CViewPDFDlg : public CDialog {
protected:
_DPdf m_drvPDF; // 自動化驅動物件
CWnd m_wndPDF; // 控件視窗
// ...
};
OnInitDialog 初始化流程BOOL CViewPDFDlg::OnInitDialog() {
CDialog::OnInitDialog();
// 關鍵:必須加入 WS_CLIPCHILDREN,否則控件繪製異常
ModifyStyle(0, WS_CLIPCHILDREN);
CRect rt; GetClientRect(&rt);
// 建立控件視窗 (ProgID: "PDF.PdfCtrl.5")
m_wndPDF.CreateControl(_T("PDF.PdfCtrl.5"), NULL,
WS_CHILD | WS_VISIBLE, rt, this, 0);
// 取得 IDispatch 指標並綁定驅動物件
LPUNKNOWN lpUnk = m_wndPDF.GetControlUnknown();
LPDISPATCH lpDisp;
lpUnk->QueryInterface(IID_IDispatch, (void**)&lpDisp);
m_drvPDF.AttachDispatch(lpDisp); // 驅動物件析構時自動 Release
// 開啟檔案對話框並載入 PDF
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK) {
m_drvPDF.LoadFile(dlg.GetPathName());
} else {
OnCancel();
}
return TRUE;
}
| 方法 | 功能 | 參數範例 |
|---|---|---|
LoadFile(path) | 載入並顯示 PDF | LoadFile("C:\\doc.pdf") |
Print() | 列印目前文件 | 無參數 |
setZoom(percent) | 設定縮放比例 | setZoom(100) (100%) |
setShowToolbar(BOOL) | 顯示/隱藏工具列 | setShowToolbar(TRUE) |
gotoFirstPage() | 跳至第一頁 | 無參數 |
gotoLastPage() | 跳至最後一頁 | 無參數 |
gotoNextPage() | 下一頁 | 無參數 |
gotoPreviousPage() | 上一頁 | 無參數 |
// 類型庫:Acrobat\ActiveX\AcroPDF.dll → 產生 IAcroAXDocShim (acropdf.h)
// ProgID: "AcroPDF.PDF.1"
// 其餘流程完全相同
PDFium、MuPDF、Qt WebEngine 等無相依嵌入方案
圖一 程式運行效果:成功嵌入顯示 PDF 文件
本方案在 VC6 + Acrobat 5.x/6.x/7.x 驗證通過,為老專案快速加入 PDF 檢視功能提供了成熟可靠的路徑。