C# WPF 打印机

C# WPF 打印机

打印机接口

  • PrintServer
  • PrintQueue
  • PrintDocument

打印文本

csharp 复制代码
/// <summary>
/// 打印文本
/// </summary>
/// <param name="text"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private void PrintText(string text, int width, int height)
{
    // 创建一个PrintDocument对象
    PrintDocument pd = new PrintDocument();
    // pd.DefaultPageSettings.Landscape = true;
    // pd.DefaultPageSettings.PrinterSettings.PrinterName = "Gprinter  GP-1134T";  // 指定打印机

    // 设置打印机任务的事件处理
    pd.PrintPage += (sender, e) =>
    {
        // 创建一个Bitmap对象,用于绘制文本                
        using (Bitmap bitmap = new Bitmap(width, height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // 使用白色填充背景
                g.FillRectangle(System.Drawing.Brushes.White, 0, 0, width, height);

                // 设置打印文本的格式
                StringFormat format = new StringFormat();
                format.Alignment = StringAlignment.Center;
                format.LineAlignment = StringAlignment.Center;

                // 在位图上绘制文本
                g.DrawString(text, new Font("Arial", 12), System.Drawing.Brushes.Black, new RectangleF(0, 0, width, height), format);

                // 将位图发送到打印机
                e.Graphics.DrawImage(bitmap, 0, 0);                        
            }
        }   
    };

    // 开始打印
    try
    {
        pd.Print();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

打印图片

csharp 复制代码
 /// <summary>
 /// 打印图片
 /// </summary>
 /// <param name="imagePath">图片文件路径</param>
 /// <param name="width">打印宽度像素</param>
 /// <param name="height">打印高度像素</param>
 private void PrintImage(string imagePath, int width, int height)
 {
     if (File.Exists(imagePath))
     {
         PrintDocument pd = new PrintDocument();
         pd.DefaultPageSettings.Landscape = true;
         //pd.DefaultPageSettings.PrinterSettings.PrinterName = "Gprinter  GP-1134T";


         Image image = Image.FromFile(imagePath);
         // 设置打印机任务的事件处理
         pd.PrintPage += (sender, e) =>
         {
             // 创建一个Bitmap对象,用于绘制图片
             using (Bitmap bitmap = new Bitmap(width, height))
             {
                 using (Graphics g = Graphics.FromImage(bitmap))
                 {
                     // 使用白色填充背景
                     g.FillRectangle(System.Drawing.Brushes.Black, 0, 0, width, height);

                     // 在位图上绘制图片
                     g.DrawImage(image, 0, 0);

                     // 将位图发送到打印机
                     e.Graphics.DrawImage(bitmap, 0, 0);
                 }
             }
#if false
             Image i = Image.FromFile(imagePath);
             System.Drawing.Rectangle m = e.MarginBounds;
             if ((double)i.Width / (double)i.Height > (double)m.Width / (double)m.Height) // image is wider
             {
                 m.Height = (int)((double)i.Height / (double)i.Width * (double)m.Width);
             }
             else
             {
                 m.Width = (int)((double)i.Width / (double)i.Height * (double)m.Height);
             }
             e.Graphics.DrawImage(i, m);                    
#endif
         };

         // 开始打印
         try
         {
             pd.Print();
         }
         catch (Exception ex)
         {
             Console.WriteLine(ex.Message);
         }

     }
 }

打印机属性对话框

csharp 复制代码
private void btnPrintSettings_Click(object sender, RoutedEventArgs e)
{
    // 打印机属性对话框
    PrintDialog printDialog = new PrintDialog();

    if (printDialog.ShowDialog() == true)
    {
        // 用户点击了打印
        Console.WriteLine("打印");
    }            
}

设置默认打印机

csharp 复制代码
/// <summary>
/// 设置默认打印机
/// </summary>
/// <param name="printerName"></param>
public static void SetDefaultPrinter(string printerName)
{
    PrintServer printServer = new PrintServer(); // 默认的打印服务器
    PrintQueue printQueue = new PrintQueue(printServer, printerName); // 根据打印机名称创建打印队列

    // 设置为默认打印机
    printQueue.Commit();
}

搜索打印机

csharp 复制代码
private void btnPrintSearch_Click(object sender, RoutedEventArgs e)
{
    // 获取打印机列表并添加到ComboBox
    PrintServer printServer = new PrintServer();
    PrintQueueCollection printQueues = printServer.GetPrintQueues();

    cmboxPrintList.Items.Clear(); // ComboBox控件
    foreach (PrintQueue p in printQueues)
    {
        cmboxPrintList.Items.Add(p.Name);
    }
}

// 选择打印机
private void cmboxPrintList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string pName = cmboxPrintList.SelectedItem as string;

    Console.WriteLine("选择打印机");

    if (pName != null)
    {
        Console.WriteLine("默认打印机:" + pName);
        SetDefaultPrinter(pName);
    }
}
相关推荐
艺杯羹13 小时前
Git版本控制深度复盘:从入门到精通的完整指南
git·wpf·版本控制·git学习·git复盘
玄〤1 天前
RabbitMQ 入门篇总结(黑马微服务课day10)(包含黑马商城业务改造)
java·笔记·分布式·spring cloud·微服务·rabbitmq·wpf
向哆哆2 天前
CANN HCCL集合通信库在分布式训练中的高性能通信方案
分布式·wpf·cann
周杰伦fans2 天前
ai-skill开发WPF踩坑
wpf
听麟2 天前
HarmonyOS 6.0+ APP智能快递代收管理系统开发实战:定位追踪与取件提醒落地
深度学习·3d·华为·wpf·harmonyos
棉晗榜3 天前
wpf将svg的多个path数据转为wpf的矢量Path几何图形数据
wpf
暖馒3 天前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
R1nG8634 天前
HCCL vs NCCL代码级对比 hccl/algorithms/ vs nccl/src/collectives/ Ring算法实现差异
wpf·cann
风指引着方向4 天前
归约操作优化:ops-math 的 Sum/Mean/Max 实现
人工智能·wpf
听麟4 天前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务