程式運行於瀏覽器、列印機在本地、資料可能在伺服器,導致列印控制彈性受限。核心問題:版面控制、分頁精準、樣式一致、效能平衡。
| 維度 | 客戶端腳本 (JavaScript) | 伺服器端程式 (C#/VB.NET) |
|---|---|---|
| 資料來源 | DOM 解析、現有頁面內容 | 資料庫重新查詢、ViewModel |
| 生成位置 | 瀏覽器端 | 伺服器端 |
| 優點 | 減輕伺服器負載、即時反映使用者畫面 | 內容豐富可控、支援複雜報表邏輯、CSS 強制分頁 |
| 缺點 | DOM 分析複雜、需約定列印區塊、跨瀏覽器相容性差 | 伺服器負載大、需額外請求/頁面 |
| 適用場景 | 簡單清單、發票、標籤、即時預覽 | 複雜報表、多頁表格、群組小計、圖表嵌入 |
@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 支援,透過 `` 自訂預覽視窗、頁首頁尾、奇偶頁不同样式。現代瀏覽器不支援,不建議新專案採用。
<%@ 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-group | CSS 加入 thead { display: table-header-group; } |
| 內容被切斷 | page-break-inside: auto 預設行為 | 關鍵列加上 .page-break-inside-avoid |
| 背景顏色/圖片不列印 | 瀏覽器預設不列印背景 | 列印對話框勾選「背景圖形」或改用 PDF |
| 中文字體模糊 | 字體回退機制 | 指定微軟正黑體、Noto Sans TC 等 Web Font |
新專案優先採用 伺服器端生成 PDF(QuestPDF、Puppeteer Sharp、wkhtmltopdf),前端僅負責預覽與觸發列印,確保跨平台一致性、精準分頁、字體嵌入、數位簽章支援。