首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

超星格式轉 BMP 實戰:Delphi 導入 ActiveX 控件法

     編輯:VC 教學

超星數字圖書格式 (.pdg) 專有加密,官方閱讀器提供 ActiveX 控件 (Pdg2 Type Library) 可實現頁面渲染與導出。本文演示在 Delphi 5 中導入該控件,通過剪貼板中轉實現 PDG → BMP 批量轉換,並給出關鍵時序控制代碼。

環境準備

  1. 安裝 超星 3.4 Beta 7 (含 PdgCtrl.ocx);
  2. Delphi 5 → Component → Import ActiveX Control → 選擇 Pdg2 Type Library (Version 1.0) → 生成 Pdg2_TLB.pas;
  3. 將生成的 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;

批量轉換注意事項

  • Visible 必須為 True:控件隱藏時渲染異常,設置 MyPdg.Visible := True (可放在表單外可見區域);
  • 間隔 Sleep(1000):連續轉換目錄下多文件時,相鄰兩次調用間必須 Sleep(1000),否則控件「罷工」不響應;
  • 剪貼板衝突:轉換期間避免人工操作剪貼板;
  • OCR 效果一般:轉 BMP 後用清華 OCR 識別準確率較低,建議嘗試更高分辨率渲染或直接調用超星導出文本接口 (若可用)。

完整調用示例

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;

原理解析

  1. LoadPage 將指定頁面解密渲染到控件表面;
  2. CopyToClipBoard 將控件客戶區像素以 DIB 格式寫入系統剪貼板;
  3. 輪詢 Clipboard.Formats 直到出現 CF_BITMAP,確保數據就緒;
  4. TBitmap.LoadFromClipboardFormat 從剪貼板句柄構建位圖對象;
  5. 可選 pf1bit 壓縮存儲,或保持 pf24bit 保真。

此法利用官方 ActiveX 控件繞過格式逆向難題,適合中小批量離線轉換場景。若需大規模高併發,建議尋求超星官方 SDK 或服務端 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved