Webブラウザでの印刷と改ページ制御の実用ガイド

Webアプリケーションで小票や帳票を印刷する際、改ページやレイアウト調整に悩むケースが多い。以下では、実際の環境(Windows 10 + 佳博 GP-L80160 プリンタ)に基づいた印刷設定と、CSS/JavaScriptによる改ページ制御の具体的な手法を紹介する。

小票プリンタの基本設定

対応ドライバ「GAINSCHA 80mmシリーズ V18」をインストール後、「デバイスとプリンター」からプロパティを開き、「余白なし」を選択することで、最大サイズで印刷可能。Google Chromeでの動作を前提とする。

CSSによる改ページ制御

page-break-after: always を使用すると、その要素の直後に強制的に改ページが挿入される。印刷専用スタイルは @media print セレクタ内で定義する。

<style media="print">
.page-break {
    page-break-after: always;
}
.no-print {
    display: none;
}
</style>

<div class="content-block">
    <h2>第1ページの内容</h2>
    <p>ここに詳細情報を記載...</p>
</div>
<div class="page-break"></div>
<div class="content-block">
    <h2>第2ページの内容</html>
    <p>次のページの情報...</p>
</div>

部分印刷のJavaScript実装

特定の範囲のみを印刷するには、コメントタグで囲い、その間のHTMLを抽出して印刷する手法が有効。

function printSection() {
    const fullHtml = document.body.innerHTML;
    const startTag = '<!--startprint-->';
    const endTag = '<!--endprint-->';
    
    const startIndex = fullHtml.indexOf(startTag) + startTag.length;
    const endIndex = fullHtml.indexOf(endTag, startIndex);
    const printContent = fullHtml.substring(startIndex, endIndex);
    
    document.body.innerHTML = printContent;
    window.print();
    location.reload(); // 印刷後は元のページに戻す
}

動的コンテンツ生成による改ページ印刷

複数の帳票を連続印刷する場合、テンプレートをループで生成し、各ブロックの末尾に改ページを挿入する。

function generateAndPrintTickets(tickets) {
    let output = '';
    tickets.forEach((ticket, index) => {
        output += `
            <div class="ticket-template">
                <h3>${ticket.title}</h3>
                <p>券番号: ${ticket.id}</p>
                <p>有効期限: ${ticket.expiry}</p>
            </div>
            ${index < tickets.length - 1 ? '<div style="page-break-after: always"></div>' : ''}
        `;
    });
    document.body.innerHTML = output;
    window.print();
}

印刷時のヘッダー・フッター制御(IE限定)

Internet Explorerでは、ActiveX経由で印刷ヘッダー・フッターをカスタマイズ可能。ただし、セキュリティ設定で許可が必要。

try {
    const shell = new ActiveXObject("WScript.Shell");
    const regPath = "HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
    shell.RegWrite(regPath + "header", "&w&b ページ &p/&P");
    shell.RegWrite(regPath + "footer", "");
} catch (e) {
    console.warn("IE以外では動作しません");
}

印刷プレビューと設定の呼び出し(IE専用)

WebBrowser ActiveXコントロールを使用して、印刷ダイアログを直接呼び出すことも可能。

<object id="iePrinter" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" width="0" height="0"></object>
<button onclick="document.getElementById('iePrinter').ExecWB(6,1)">印刷</button>
<button onclick="document.getElementById('iePrinter').ExecWB(7,1)">プレビュー</button>
<button onclick="document.getElementById('iePrinter').ExecWB(8,1)">ページ設定</button>

レスポンシブ印刷スタイルの応用

画面表示と印刷出力を分けることで、印刷時のみ特殊フォーマットを適用できる。

<style>
@media screen {
    .print-only { display: none; }
}
@media print {
    .screen-only { display: none; }
    body { font-size: 10pt; }
}
</style>

タグ: css-print javascript-print page-break thermal-printer Browser-Compatibility

7月12日 20:53 投稿