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);
    }
}
相关推荐
笺上知微1 小时前
基于HelixToolkit.SharpDX 渲染3D模型
wpf
晓纪同学1 天前
WPF-03 第一个WPF程序
大数据·hadoop·wpf
光电大美美-见合八方中国芯1 天前
用于无色波分复用光网络的 10.7 Gb/s 反射式电吸收调制器与半导体光放大器单片集成
网络·后端·ai·云计算·wpf·信息与通信·模块测试
晓纪同学1 天前
WPF-02体系结构
wpf
晓纪同学1 天前
WPF-01概述
wpf
海盗12342 天前
OxyPlot 在 WPF 中的使用
.net·wpf
晓纪同学2 天前
WPF-04 XAML概述
wpf
△曉風殘月〆2 天前
如何在WPF中捕获窗口外的事件
wpf
爱吃烤鸡翅的酸菜鱼4 天前
Java 事件发布-订阅机制全解析:从原生实现到主流中间件
java·中间件·wpf·事件·发布订阅
武藤一雄4 天前
WPF中ViewModel之间的5种通讯方式
开发语言·前端·microsoft·c#·wpf