超星數字圖書格式 (.pdg) 專有加密,官方閱讀器提供 ActiveX 控件 (Pdg2 Type Library) 可實現頁面渲染與導出。本文演示在 Delphi 5 中導入該控件,通過剪貼板中轉實現 PDG → BMP 批量轉換,並給出關鍵時序控制代碼。
PdgCtrl.ocx);Component → Import ActiveX Control → 選擇 Pdg2 Type Library (Version 1.0) → 生成 Pdg2_TLB.pas;TPdg 控件拖放到表單上,命名 MyPdg。procedure TMainForm.PdgToBmp(FPdgName, FBmpName: string);
// FPdgName: 超星文件路徑
// FBmpName: 輸出 BMP 路徑
var
i: Integer;
bmp: TBitmap;
j: Boolean;
begin
Clipboard.Clear;
MyPdg.LoadPage(FPdgName, 0, 0, 10); // 加載第 1 頁
MyPdg.Refresh;
// 關鍵:CopyToClipBoard 可能需重試才能成功寫入位圖格式
j := False;
while not j do begin
MyPdg.CopyToClipBoard(0, 0, MyPdg.PageWidth, MyPdg.PageHeight);
for i := 0 to Clipboard.FormatCount - 1 do
if Clipboard.Formats[i] = CF_BITMAP then begin
j := True; Break;
end;
if not j then Sleep(50); // 短暫等待避免佔用 CPU
end;
bmp := TBitmap.Create;
try
bmp.LoadFromClipboardFormat(CF_BITMAP, Clipboard.GetAsHandle(CF_BITMAP), 0);
bmp.PixelFormat := pf1bit; // 黑白雙色,壓縮體積
bmp.SaveToFile(FBmpName);
finally
bmp.Free;
end;
end;
MyPdg.Visible := True (可放在表單外可見區域);Sleep(1000),否則控件「罷工」不響應;procedure TMainForm.BatchConvert(const Dir: string);
var
sr: TSearchRec;
pdgFile, bmpFile: string;
begin
if FindFirst(Dir + '\*.pdg', faArchive, sr) = 0 then begin
repeat
pdgFile := Dir + '\' + sr.Name;
bmpFile := ChangeFileExt(pdgFile, '.bmp');
PdgToBmp(pdgFile, bmpFile);
Sleep(1000); // 關鍵間隔
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
LoadPage 將指定頁面解密渲染到控件表面;CopyToClipBoard 將控件客戶區像素以 DIB 格式寫入系統剪貼板;Clipboard.Formats 直到出現 CF_BITMAP,確保數據就緒;TBitmap.LoadFromClipboardFormat 從剪貼板句柄構建位圖對象;pf1bit 壓縮存儲,或保持 pf24bit 保真。此法利用官方 ActiveX 控件繞過格式逆向難題,適合中小批量離線轉換場景。若需大規模高併發,建議尋求超星官方 SDK 或服務端 API。