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);
    }
}
相关推荐
donk13142 天前
React Native for OpenHarmony 实战:三方库 react-native-circular-action-menu 的鸿蒙化适配指南
javascript·分布式·react native·react.js·wpf·harmonyos
donk13143 天前
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南
分布式·react native·react.js·wpf·harmonyos
He BianGu3 天前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
VidDown3 天前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
He BianGu3 天前
【笔记】WPF中CachingHint的功能
笔记·wpf
He BianGu3 天前
【笔记】在WPF中BitmapScalingMode的作用
笔记·wpf
Vae_Mars4 天前
幂等性学习笔记
笔记·学习·wpf
samble5 天前
从零搭建灌装监控系统(十九):单元测试实战,xUnit + 内存SQLite + 反射测试私有方法
c#·wpf·mvvm·modbus·工业控制
光泽雨5 天前
路由概念和路由事件 继承链路 RadioButton的事件解析
wpf
samble6 天前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制