C# 使用 PrintDocument 实现简单文本打印实例

阿麦
阿麦
发布时间:2026-10-14| 4人浏览过
原创

在 Windows Forms 应用程序中,有时需要直接向打印机输出纯文本内容。本文提供一个基于 PrintDocument 和 StreamReader 的完整 C# 示例,展示如何配置打印格式、逐行渲染文字以及自动处理多页打印逻辑。

结果与目标

最终目标是能够指定一个文本文件路径,启动打印任务并将文件内容按预设字体(如宋体、12号字)原样打印到默认打印机上。程序将自动计算每页可容纳的行数,并在内容超出页面时进行分页,确保用户无需手动干预即可打印长文档。

准备条件

  • 开发环境:Visual Studio 及 .NET Framework(支持 System.Drawing.Printing 命名空间)。
  • 依赖库:System.IO 用于文件流操作,System.Drawing 用于图形绘制,System.Windows.Forms 用于窗体结构。
  • 测试文件:准备一个包含多行文本的文件,例如 F:\Temp.txt,确保路径存在且可读。

第1步:构建打印主窗体

目的:创建一个触发打印流程的主窗体类。
入口:新建 Windows Form 类 PrintFileForm。
动作:在构造函数中实例化打印辅助类并调用其打印方法。

public partial class PrintFileForm : Form
{
    public PrintFileForm()
    {
        InitializeComponent();
        // 创建打印文件实例并直接执行打印
        PrintFile prinFile = new PrintFile();
        prinFile.Print();
    }
}

第2步:定义打印文件处理类

目的:封装具体的打印逻辑,分离文件读取与绘图操作。
入口:新建类 PrintFile。
重要参数:设置字体为“宋体”,大小12磅;指定源文件路径。

class PrintFile
{
    StreamReader sr = null;
    // 定义打印字体
    Font printFont = new Font("宋体", 12);

    public void Print()
    {
        try
        {
            // 打开待打印的文本文件
            sr = new StreamReader(@"F:\Temp.txt");
            try
            {
                // 实例化打印文档对象
                PrintDocument printDoc = new PrintDocument();
                // 订阅打印页面事件
                printDoc.PrintPage += printDoc_PrintPage;
                // 执行打印
                printDoc.Print();
            }
            finally
            {
                // 无论成功或失败,确保关闭文件流
                if (sr != null)
                    sr.Close();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }...

第3步:实现 PrintPage 事件处理程序

目的:控制每一页的内容绘制,实现自动分页。
入口:添加 printDoc_PrintPage 方法。
关键逻辑:

  1. 计算行数:根据可用打印区域高度和字体高度,计算当前页能显示的最大行数(pageLine)。
  2. 循环绘制:遍历文件,使用 Graphics.DrawString 将每行文字画到页面上。起始位置由 MarginBounds.Top 和偏移量决定。
  3. 分页判断:如果读完当前页后文件中仍有剩余内容(line != null),设置 e.HasMorePages = true 触发下一页打印;否则设为 false 结束打印。
void printDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    string line = null;
    
    // 计算一页可容纳的行数
    float pageLine = e.MarginBounds.Height / printFont.GetHeight(e.Graphics);
    
    // 循环打印每一行,直到满页或文件结束
    for (int count = 0; count < pageLine && ((line=sr.ReadLine())!=null); count++)
    {
        // 计算当前行的垂直位置
        float singleLine = e.MarginBounds.Top + (count * printFont.GetHeight(e.Graphics));
        // 绘制文字
        e.Graphics.DrawString(line, printFont, Brushes.Black, e.MarginBounds.Left, singleLine);
    }
    
    // 判断是否继续打印下一页
    if (line != null)
        e.HasMorePages = true;
    else
        e.HasMorePages = false;
}

完成判断

运行应用后,若未捕获异常,系统将弹出打印机选择对话框或直接发送任务至默认打印机。检查已打印纸张,确认文字无重叠、无截断,且多页文档分页正确。控制台若有输入错误信息,请检查 F:\Temp.txt 路径权限或文件编码是否为 ANSI/UTF-8 兼容。

简要总结

通过上述步骤,我们实现了基于 C# 的基本文本打印功能。关键在于利用 PrintPage 事件的多次触发机制来处理长文本,并通过 HasMorePages 属性控制分页流程。对于更复杂的报表或富文本打印,建议引入第三方控件或更精细的布局管理。

以上就是 C# 实现简单打印的详细内容,更多关于 C# 打印技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。