[Electron] ウィンドウのコンテンツをバックグラウンドで印刷

2023-02-01

2023-02-01

検証環境

  • Windows 10 Pro 22H2
  • Node.js v18.14.0
  • Electron 22.2.0

印刷用のウィンドウを作成

Reactを使用している場合、過去記事[Electron] Electron+React+Typescriptでマルチウィンドウアプリの作成を参照してください。

印刷用ウィンドウの不可視設定

アプリ書き出し後はウィンドウを非表示にするように、showプロパティの設定を行います。

...
const isShow = !app.isPackaged;
subWindow = new BrowserWindow({
    show: isShow,
    ...
});
...

注意 : 多重起動防止設定をしている場合

過去記事[Electron] Windowsタブレット向け業務用アプリ作成時の知見で解説したような、app.requestSingleInstanceLock()メソッドで多重起動を防止している場合、アプリの終了設定によっては、メインウィンドウを閉じても不可視設定の印刷用ウィンドウが残っているためアプリが終了せず、再度アプリを起動しようとしても起動しなくなってしまいます。(タスクマネージャーから強制終了させるしかアプリを落とす方法が無くなってしまいます。)

不可視化したいウィンドウはparentプロパティを設定してメインウィンドウの子ウィンドウにするか、メインウィンドウが閉じた際にapp.quit()を実行する必要があります。

parentを設定

...
subWindow = new BrowserWindow({
    ...
    show: false,
    parent: mainWindow, 
    ...
});
...

または

メインウィンドウが閉じるとアプリ自体が終了

...
mainWindow.on('closed', () => {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});
...

印刷

BrowserWindow.webContents.print()メソッドで特定のウィンドウのコンテンツを印刷することができます。

https://www.electronjs.org/ja/docs/latest/api/web-contents#contentsprintoptions-callback

...
const printerName = '[プリンター名を指定]';
subWindow.webContents.print(
    { 
        silent: true, 
        deviceName: printerName
    }, (success, errorType) => {
        if (!success) console.log(errorType)
    }
);
...

第一引数に渡すObjectのsilentプロパティをtrueにすることで、以下のような印刷ウィンドウを出さずにバックグラウンドで印刷することができます。

print_2

また、deviceNameに、OSに登録されているプリンター名を設定することで、特定のプリンターで印刷が実行できます。(設定しない場合、OSでデフォルト設定になっているプリンターで印刷されます。)

print_1

なお、第二引数にコールバック関数を渡せますが、この関数が実行されるのは実際にプリンターでの印刷が完了した時点ではありません。印刷命令がプリンタードライバーに送信された時点のようです。

プリンター情報の取得

BrowserWindow.webContents.getPrintersAsync()メソッドでOSに登録されているプリンター一覧が取得できます。

以下のようなオブジェクトの配列がPromise型で返ってくるので、使用したいプリンターのnameプロパティを取得して、先述のprint()deviceNameに渡すことで、指定したプリンターでの印刷が可能です。

[
    {
        name: 'EPSON...',
        displayName: 'EPSON...',
        description: '',
        status: 0,
        isDefault: true,
        options: {
            'printer-location': 'http://...',
            'printer-make-and-model': 'Microsoft IPP Class Driver',
            system_driverinfo: 'Microsoft IPP Class Driver;...'
        }
    },
    ...
]