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

C# 列印功能完整實作:PrintDocument、預覽、頁面設定與對話框整合

     編輯:關於C#

列印架構四大核心元件

所有對話框皆透過 Document 屬性綁定同一個 PrintDocument 實例,共享設定。

PrintDocument 核心成員


PrintDocument pd = new PrintDocument();
pd.DocumentName = "我的文件";          // 顯示在印表機佇列
pd.PrintPage += Pd_PrintPage;          // 核心繪製事件
pd.BeginPrint += Pd_BeginPrint;        // 列印開始前初始化
pd.EndPrint += Pd_EndPrint;            // 列印結束清理
pd.PrinterSettings = ...;              // 印表機設定
pd.DefaultPageSettings = ...;          // 預設頁面設定

PrintPage 事件:逐頁繪製邏輯


private StringReader _lineReader;
private Font _printFont;

private void Pd_BeginPrint(object sender, PrintEventArgs e)
{
    _printFont = textBox.Font;
    _lineReader = new StringReader(textBox.Text);
}

private void Pd_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics g = e.Graphics;
    float linesPerPage = e.MarginBounds.Height / _printFont.GetHeight(g);
    float yPos = e.MarginBounds.Top;
    int count = 0;
    string line;

    while (count < linesPerPage && (line = _lineReader.ReadLine()) != null)
    {
        yPos = e.MarginBounds.Top + count * _printFont.GetHeight(g);
        g.DrawString(line, _printFont, Brushes.Black, e.MarginBounds.Left, yPos);
        count++;
    }

    e.HasMorePages = (line != null); // 還有資料 → 觸發下一次 PrintPage
}

private void Pd_EndPrint(object sender, PrintEventArgs e)
{
    _lineReader?.Dispose();
    _lineReader = null;
}

關鍵點:

  • e.MarginBounds:可列印區域(扣除邊界)
  • e.Graphics:頁面繪圖介面,同 Paint 事件
  • e.HasMorePages:控制多頁列印流程
  • 使用 StringReader 記憶讀取位置,跨頁面連續

整合四大對話框


// 列印設定
private void MenuPrintSetup_Click(object sender, EventArgs e)
{
    using (var dlg = new PrintDialog { Document = pd })
        dlg.ShowDialog();
}

// 頁面設定
private void MenuPageSetup_Click(object sender, EventArgs e)
{
    using (var dlg = new PageSetupDialog { Document = pd })
        dlg.ShowDialog();
}

// 列印預覽
private void MenuPrintPreview_Click(object sender, EventArgs e)
{
    using (var dlg = new PrintPreviewDialog { Document = pd })
    {
        _lineReader = new StringReader(textBox.Text); // 重置讀取器
        try { dlg.ShowDialog(); }
        catch (Exception ex) { MessageBox.Show(ex.Message); }
    }
}

// 正式列印
private void MenuPrint_Click(object sender, EventArgs e)
{
    using (var dlg = new PrintDialog { Document = pd })
    {
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            _lineReader = new StringReader(textBox.Text);
            try { pd.Print(); }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }
}

進階繪製技巧

元件命名空間用途
PrintDocumentSystem.Drawing.Printing核心列印邏輯、頁面內容繪製、事件驅動
PrintDialogSystem.Windows.Forms選擇印表機、份數、頁面範圍
PageSetupDialogSystem.Windows.Forms紙張大小、方向、邊界
PrintPreviewDialogSystem.Windows.Forms列印預覽視窗

資源管理與效能

  • Font、Brush、Pen 實作 IDisposable,用 using 或統一在 EndPrint 釋放
  • 大量資料列印考慮背景執行緒 + PrintController 避免 UI 凍結
  • 預覽對話框會多次觸發 PrintPage,確保邏輯可重入

總結流程

  1. 表單初始化建立 PrintDocument,掛接 PrintPage/BeginPrint/EndPrint
  2. 使用者透過選單開啟「頁面設定」/「列印預覽」/「列印設定」
  3. 點擊「列印」→ 顯示 PrintDialog → 確認後呼叫 pd.Print()
  4. PrintDocument 依序觸發 BeginPrint → 多次 PrintPage → EndPrint
  5. 列印完成,資源釋放
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求實作方式
表格/格線g.DrawLine/Pen 計算座標繪製
圖片g.DrawImage(Image, Rect) 注意解析度
頁碼在 PrintPage 末尾 g.DrawString($"第 {pageNum} 頁", ...)
不同字型/顏色建立多個 Font/Brush 物件,using 釋放
橫向列印pd.DefaultPageSettings.Landscape = true