首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 網頁列印技術全方位總結:客戶端/伺服器端生成、CSS 分頁、列印模板與最佳實踐

     編輯:關於ASP.NET

B/S 架構列印的特殊挑戰

程式運行於瀏覽器、列印機在本地、資料可能在伺服器,導致列印控制彈性受限。核心問題:版面控制、分頁精準、樣式一致、效能平衡。

列印文檔生成兩大流派

維度客戶端腳本 (JavaScript)伺服器端程式 (C#/VB.NET)
資料來源DOM 解析、現有頁面內容資料庫重新查詢、ViewModel
生成位置瀏覽器端伺服器端
優點減輕伺服器負載、即時反映使用者畫面內容豐富可控、支援複雜報表邏輯、CSS 強制分頁
缺點DOM 分析複雜、需約定列印區塊、跨瀏覽器相容性差伺服器負載大、需額外請求/頁面
適用場景簡單清單、發票、標籤、即時預覽複雜報表、多頁表格、群組小計、圖表嵌入

頁面設定與 CSS 分頁控制

關鍵 CSS 屬性

@media print {
    @page {
        margin: 2cm 1.5cm;          /* 頁邊距 */
        size: A4 portrait;           /* 紙張大小與方向 */
        @top-center { content: "機密文件"; }  /* 頁首 */
        @bottom-right { content: "第 " counter(page) " 頁"; } /* 頁尾 */
    }
    .no-print { display: none !important; }  /* 隱藏非列印區塊 */
    .page-break-before { page-break-before: always; }
    .page-break-after { page-break-after: always; }
    .page-break-inside-avoid { page-break-inside: avoid; } /* 避免表格跨頁斷裂 */
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid #ddd; padding: 4px; font-size: 12px; }
}

IE 列印模板

僅 IE 支援,透過 `` 自訂預覽視窗、頁首頁尾、奇偶頁不同样式。現代瀏覽器不支援,不建議新專案採用。

列印觸發方式

  1. window.print():最簡單,列印當前視窗,無法控制頁首頁尾、邊距。
  2. WebBrowser 控制項 (WinForms/WPF):`webBrowser.Print()` 或 `ExecWB(OLECMDID_PRINT, ...)`,適用桌面應用內嵌瀏覽器列印。
  3. 專用報表元件:Stimulsoft、FastReport、Telerik Reporting、DevExpress Reporting,支援設計器、匯出 PDF/Excel/Word、伺服器端無頭列印。
  4. PDF 生成 + 列印:iTextSharp、PdfSharp、QuestPDF、DinkToPdf (Headless Chrome) 產生 PDF,前端 `iframe.contentWindow.print()` 或瀏覽器原生 PDF 列印。

實戰最佳實踐:GridView 列印專用頁面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PrintGrid.aspx.cs" Inherits="PrintGrid" %>
<!DOCTYPE html>
<html>
<head>
    <title>列印預覽</title>
    <style media="print">
        @page { margin: 1.5cm; @bottom-center { content: "第 " counter(page) " 頁 / 共 " counter(pages) " 頁"; } }
        body { font-family: "Microsoft JhengHei", sans-serif; font-size: 12px; }
        .print-header { text-align: center; margin-bottom: 20px; }
        .print-header h2 { margin: 0; font-size: 18px; }
        .print-meta { font-size: 11px; color: #666; }
        table { width: 100%; border-collapse: collapse; page-break-inside: auto; }
        thead { display: table-header-group; }  /* 關鍵:跨頁重複表頭 */
        th, td { border: 1px solid #333; padding: 6px; text-align: left; }
        tr.page-break { page-break-before: always; }
    </style>
</head>
<body onload="window.print(); window.onafterprint = () => window.close();">
    <div class="print-header">
        <h2><asp:Literal ID="ltTitle" runat="server" /></h2>
        <div class="print-meta">列印時間:<asp:Literal ID="ltTime" runat="server" /></div>
    </div>
    <asp:GridView ID="gvData" runat="server" AutoGenerateColumns="False" GridLines="None" ShowHeader="True">
        <Columns>
            <asp:BoundField DataField="Id" HeaderText="編號" ItemStyle-Width="60px" />
            <asp:BoundField DataField="Name" HeaderText="名稱" />
            <asp:BoundField DataField="Amount" HeaderText="金額" DataFormatString="{0:N0}" ItemStyle-HorizontalAlign="Right" />
        </Columns>
    </asp:GridView>
</body>
</html>

後端綁定邏輯

protected void Page_Load(object sender, EventArgs e) {
    if (!IsPostBack) {
        int reportId = int.Parse(Request.QueryString["id"]);
        var data = ReportService.GetPrintData(reportId);
        ltTitle.Text = data.Title;
        ltTime.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm");
        gvData.DataSource = data.Rows;
        gvData.DataBind();
    }
}

常見問題與解決方案

問題原因解決方案
表格跨頁表頭不重複thead 未設定 display: table-header-groupCSS 加入 thead { display: table-header-group; }
內容被切斷page-break-inside: auto 預設行為關鍵列加上 .page-break-inside-avoid
背景顏色/圖片不列印瀏覽器預設不列印背景列印對話框勾選「背景圖形」或改用 PDF
中文字體模糊字體回退機制指定微軟正黑體、Noto Sans TC 等 Web Font

現代化建議

新專案優先採用 伺服器端生成 PDF(QuestPDF、Puppeteer Sharp、wkhtmltopdf),前端僅負責預覽與觸發列印,確保跨平台一致性、精準分頁、字體嵌入、數位簽章支援。

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