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

Delphi 開發 Web 列印 ActiveX 元件:自訂紙張、精準定位、VBScript 呼叫

     編輯:Delphi

需求背景

B/S 架構下,瀏覽器無法直接存取客戶端印表機進行精準套印 (如發票、報表)。解決方案:開發 ActiveX 元件 (COM),客戶端安裝後,網頁以 VBScript/JavaScript 呼叫元件方法進行列印。

元件介面設計

// IPrintTest3 (Type Library)
interface IPrintTest3 : IDispatch
{
  [id(1)] HRESULT prtCustomPage([in] long PageWidth, [in] long PageHeight); // 0.1mm 單位
  [id(2)] HRESULT prtStart();          // 初始化印表機
  [id(3)] HRESULT prtNewPage();        // 換頁
  [id(4)] HRESULT prtEnd();            // 結束列印
  [id(5)] HRESULT prtDrawLine([in] long X1, [in] long Y1, [in] long X2, [in] long Y2, [in] long LineWidth);
  [id(6)] HRESULT prtSetFont([in] BSTR FontName, [in] long FontSize);
  [id(7)] HRESULT prtTextRect([in] long VAlign, [in] long HAlign,
                              [in] long Left, [in] long Top, [in] long Right, [in] long Bottom,
                              [in] BSTR PrintString);
  [propget, id(8)] HRESULT IsInit([out, retval] long* Val); // 初始化成功旗標
};

關鍵實作細節

1. 自訂紙張大小設定 (DEVMODE)

function TPrintTest3.InitPrintPaper: Boolean;
var
  DevMode: PDEVMODE;
  Device, Driver, Port: array[0..255] of Char;
  hDevMode: THandle;
begin
  Result := False;
  if not FIsCustomPaper then Exit;
  Printer.GetPrinter(Device, Driver, Port, hDevMode);
  if hDevMode = 0 then Exit;
  DevMode := GlobalLock(hDevMode);
  try
    if DevMode = nil then Exit;
    with DevMode^ do
    begin
      dmFields := dmFields or DM_PAPERSIZE or DM_PAPERLENGTH or DM_PAPERWIDTH or DM_ORIENTATION;
      dmPaperSize := DMPAPER_USER;
      dmPaperWidth := FPaperWidth * 10;  // 0.1mm → 0.01mm (DEVMODE 單位)
      dmPaperLength := FPaperHeight * 10;
      dmOrientation := IfThen(FOrientation = 0, DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE);
      dmCopies := 1;
    end;
    GlobalUnlock(hDevMode);
    Printer.SetPrinter(Device, Driver, Port, hDevMode);
    Result := True;
  except
    GlobalUnlock(hDevMode);
  end;
end;

2. 座標轉換:0.1mm → 印表機像素

function TPrintTest3.MMToPrinterPixels(const Pt: TPoint): TPoint;
var
  DPIX, DPIY: Integer;
begin
  if not FCachedDPI then
  begin
    DPIX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    DPIY := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
    FDPIX := DPIX; FDPIY := DPIY; FCachedDPI := True;
  end;
  // 1 inch = 25.4 mm = 254 * 0.1mm
  Result.X := MulDiv(Pt.X, FDPIX, 2540);
  Result.Y := MulDiv(Pt.Y, FDPIY, 2540);
end;

VBScript 網頁呼叫範例

<script language="VBScript">
<!--
Sub TestPrint
  Dim Obj
  Set Obj = CreateObject("PrintTest3.PrintTest3")
  Obj.prtCustomPage 1000, 1000  ' 100mm x 100mm
  Obj.prtStart
  If Obj.IsInit Then
    Obj.prtDrawLine 0, 0, 1000, 1000, 1
    Obj.prtSetFont "新細明體", 16
    Obj.prtTextRect 2, 2, 0, 0, 1000, 500, "Web 列印測試"
    Obj.prtEnd
  End If
  Set Obj = Nothing
End Sub
TestPrint()
-->
</script>

註冊與部署

  • 開發機:Run → Register ActiveX Server。
  • 用戶端:複製 .dll、.tlb,執行 regsvr32 PrintTest3.dll。
  • IE 安全性設定:將網站加入「信任的網站」,啟用「未標記為安全的 ActiveX 控制項初始化並執行腳本」。

現代替代方案

ActiveX 僅限 IE/Windows。現代 Web 列印建議:

  • 瀏覽器原生 window.print() + CSS @media print 排版。
  • PDF.js / pdfmake / jsPDF 產生 PDF 讓使用者自行列印。
  • WebAssembly 列印庫 (如 print.js)。
  • 本地列印服務 (HTTP/WebSocket) + 原生列印程式 (跨平台)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved