超星 (Chaoxing) 數字圖書採用專有 PDG 格式,需透過其官方 ActiveX 控制項進行頁面渲染與匯出。本文記錄利用 Delphi/C++Builder 匯入 ActiveX、程式化控制 Pdg2 控制項實現 PDG→BMP 批次轉換的完整流程與避坑指南。
TPdg2 元件 (MyPdg) 放置表單,設定 Visible = True (關鍵!)
procedure TMainForm.PdgToBmp(FPdgName, FBmpName: string);
var
i: Integer;
HasBitmap: Boolean;
begin
Clipboard.Clear;
MyPdg.LoadPage(FPdgName, 0, 0, 10); // 載入第 1 頁
MyPdg.Refresh;
// 重試機制:確保剪貼簿確實取得位圖
HasBitmap := False;
repeat
MyPdg.CopyToClipBoard(0, 0, MyPdg.PageWidth, MyPdg.PageHeight);
for i := 0 to Clipboard.FormatCount - 1 do
if Clipboard.Formats[i] = CF_BITMAP then // CF_BITMAP = 2
HasBitmap := True;
until HasBitmap;
// 從剪貼簿取得位圖並儲存
Bmp.LoadFromClipboardFormat(CF_BITMAP, Clipboard.GetAsHandle(CF_BITMAP), 0);
Bmp.PixelFormat := pf1bit; // 黑白二值化 (可選)
Bmp.SaveToFile(FBmpName);
end;
// 目錄遍歷主迴圈
for each PdgFile in Directory do begin
PdgToBmp(PdgFile, ChangeFileExt(PdgFile, '.bmp'));
Sleep(1000); // 必須!給 ActiveX 釋放資源/重置狀態的時間
Application.ProcessMessages; // 保持 UI 回應
end;
| 問題 | 原因 | 解決方案 |
|---|---|---|
| CopyToClipBoard 偶發失敗 | ActiveX 內部渲染非同步,剪貼簿尚未就緒 | 輪詢 Clipboard.FormatCount 檢查 CF_BITMAP,重試直到成功 |
| 連續轉換後續失敗 | ActiveX 內部狀態未重置,資源未釋放 | Sleep(1000) + Visible=True 強制同步 |
| 轉檔後 OCR 辨識率低 | PDG 掃描頁本身解析度低/雜訊大,非轉換問題 | 嘗試 pf24bit 保留灰階、外接專業 OCR 引擎 (Tesseract/ABBYY) |
pdg2bmp.exe),適合伺服器端批次處理comtypes / pywin32 呼叫 ActiveX,跨平台腳本化雖 ActiveX 方案屬「曲線救國」,但在缺乏官方 SDK 情況下,仍是快速整合現有系統的可行路徑。掌握「ActiveX 匯入 → 事件驅動/輪詢同步 → 資源釋放節奏控制」三部曲,可應對多數廠商專有格式轉換需求。