TCCFujitsuPrinterコンポーネントを用いたBluetoothドットプリンタでの帳票印刷

業務システムにおいて、スマートフォンからBluetooth接続のドットプリンタを使って帳票を印刷する要件が発生しました。専門家がメーカー提供のSDKをラップし、Delphiでこの機能を実現するコンポーネントを作成しました。

本コンポーネントを使用した印刷処理の流れを解説します。

procedure startScanDevices;
procedure stopScanDevices;
function getScanedDevices: TList<TCCFujitsuPrinterDevice>;
function openConnection(ADevice: TCCFujitsuPrinterDevice): Integer;
procedure printPDFPaper(pdfPath: String; sX: Integer; mode: Integer);

TCCFujitsuPrinterは上記のメソッドを提供します。startScanDevicesで周辺のBluetoothプリンタをスキャンし、

property Devices: TList<TCCFujitsuPrinterDevice> read FDevices;

stopScanDevicesでスキャンを停止し、getScanDevicesを呼び出すとスキャン結果がDevicesプロパティに格納されます。

次にopenConnectionでプリンタに接続します。成功時は戻り値として1が返ります。最後にprintPDFPaperで印刷を実行します。

以下は実際のプロジェクトで使用したプリンタ検索コードです。kbmMW Schedulerを使って非同期処理を実装しています。

procedure TPrintFrame.ScanPrinter;
begin
  if IsConnectPrinter = 1 then
    Exit;

  AniIndicator1.Visible := True;
  AniIndicator1.Enabled := True;
  Printer.startScanDevices;

  Scheduler.Schedule(
    procedure(const AScheduledEvent: IkbmMWScheduledEvent)
    var
      i: Integer;
    begin
      CCButton1.Text := 'プリンタを検索中...';
      Printer.getScanedDevices;

      for i := 0 to Printer.Devices.Count - 1 do
      begin
        if (Printer.Devices[i].DeviceName = 'BluetoothPrinter') and (Printer.Devices[i].Paired) then
        begin
          DeviceIndex := i;
          printer.stopScanDevices;
          IsConnectPrinter := printer.openConnection(Printer.Devices[i]);
          Sleep(500);

          AniIndicator1.Visible := False;
          AniIndicator1.Enabled := False;
          CCButton1.Text := '印刷開始';
          AScheduledEvent.Activate(False);
          Break;
        end;
      end;
    end)
    .Synchronized
    .NamedAs('ScanPrinter')
    .EverySecond(2)
    .Activate;
end;

プリンタが検出されたら、実際の印刷処理を実行します。

procedure TPrintFrame.CCButton1Click(Sender: TObject);
begin
  if DeviceIndex = -1 then
    Exit;

  if IsConnectPrinter <> 1 then
    IsConnectPrinter := Printer.openConnection(Printer.Devices[DeviceIndex]);

  Scheduler.Run(
    procedure
    begin
      Printer.printPDFPaper(FInfo.Data['FileName'].AsString, 0, 2);
    end)
    .Activate;
end;

上記のコードでもkbmMW Schedulerを使用し、スレッド内で印刷処理を行っています。

実装が完了したら、配布時には以下のSOファイルを同梱する必要があります。

本コンポーネントは次期バージョンに統合予定です。プロジェクトでご利用になりたい場合は、作者までお問い合わせください。

開発中に確認した注意点:Releaseビルドでないと正常に印刷できません。

タグ: Delphi Bluetooth Printer SDK Component

7月17日 01:44 投稿