当前位置: 首页 > news >正文

基于WPF实现打印机连接与打印功能

一、项目配置

  1. 创建WPF项目

    dotnet new wpf -n WpfPrinterDemo
    cd WpfPrinterDemo
    
  2. 添加必要引用

    • System.Printing(用于打印机管理)
    • System.Windows.Controls(界面控件)

二、界面设计 (MainWindow.xaml)

<Window x:Class="WpfPrinterDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="打印机Demo" Height="450" Width="800"><Grid><!-- 打印预览区域 --><ScrollViewer VerticalScrollBarVisibility="Auto" Margin="10"><FlowDocument x:Name="PrintDocument" PagePadding="20"FontFamily="Arial"FontSize="14"><Paragraph><Run Text="WPF打印机测试文档"/><LineBreak/><Bold>当前时间:</Bold><TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat='yyyy-MM-dd HH:mm:ss'}"/></Paragraph></FlowDocument></ScrollViewer><!-- 控制按钮 --><StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Center" Orientation="Horizontal" Margin="10"><Button Content="打印预览" Width="120" Margin="5" Click="PreviewPrint"/><Button Content="直接打印" Width="120" Margin="5" Click="DirectPrint"/><Button Content="选择打印机" Width="120" Margin="5" Click="SelectPrinter"/></StackPanel></Grid>
</Window>

三、核心代码实现 (MainWindow.xaml.cs)

using System;
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;namespace WpfPrinterDemo
{public partial class MainWindow : Window{private PrintDialog _printDialog;private PrintQueue _selectedPrinter;public MainWindow(){InitializeComponent();InitializePrinter();}// 初始化打印机连接private void InitializePrinter(){_printDialog = new PrintDialog();_printDialog.PrintTicket.PageOrientation = PageOrientation.Portrait;_printDialog.PrintTicket.PageMediaSize = PageMediaSize.A4;}// 打印预览private void PreviewPrint(object sender, RoutedEventArgs e){if (_printDialog.ShowDialog() == true){_printDialog.PrintDocument(PrintDocument.DocumentPaginator, "WPF打印预览");}}// 直接打印private void DirectPrint(object sender, RoutedEventArgs e){try{if (_selectedPrinter == null)throw new Exception("请先选择打印机");var writer = PrintQueue.CreateXpsDocumentWriter(_selectedPrinter);writer.Write(PrintDocument);MessageBox.Show("打印任务已发送");}catch (Exception ex){MessageBox.Show($"打印失败: {ex.Message}");}}// 选择打印机private void SelectPrinter(object sender, RoutedEventArgs e){var printServer = new PrintServer();var printers = printServer.GetPrintQueues();var dialog = new PrintDialog();dialog.PrintQueue = printers.FirstOrDefault(p => p.Name.Contains("HP LaserJet")); // 示例选择HP打印机_selectedPrinter = dialog.PrintQueue;}}
}

四、关键功能说明

1. 打印设置配置
// 设置打印参数
_printDialog.PrintTicket.PageOrientation = PageOrientation.Landscape; // 横向打印
_printDialog.PrintTicket.PageMediaSize = PageMediaSize.A5; // 纸张尺寸
_printDialog.PrintTicket.CopyCount = 2; // 打印份数
2. 打印内容生成
// 动态添加内容
var paragraph = new Paragraph();
paragraph.Inlines.Add(new Run("动态添加的文本内容"));
PrintDocument.Blocks.Add(paragraph);
3. 打印机管理
// 获取所有打印机
var printers = new PrintServer().GetPrintQueues();// 筛选特定打印机
var targetPrinter = printers.FirstOrDefault(p => p.Name.Contains("Zebra"));

参考代码 wpf连接打印机实例demo www.youwenfan.com/contentcsh/59183.html

五、高级功能扩展

1. 打印预览增强
// 添加页眉页脚
PrintDocument.Header = new HeaderFooter {HeaderTemplate = (DataTemplate)XamlReader.Load(@"<DataTemplate><TextBlock Text='机密文档' FontSize='16' HorizontalAlignment='Center'/></DataTemplate>")
};
2. 图像打印支持
// 添加图片到打印内容
var image = new Image {Source = new BitmapImage(new Uri("logo.png", UriKind.Relative)),Width = 200,Height = 100
};
PrintDocument.Blocks.Add(new Paragraph(image));
3. 打印队列监控
// 监听打印状态
var printJob = _selectedPrinter.AddJob("TestJob");
printJob.Start();
printJob.End();

六、部署注意事项

  1. 权限配置

    • 需要System.Printing程序集引用

    • App.manifest中添加:

      <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      
  2. 打印机驱动

    • 确保目标打印机已安装正确驱动
    • 测试环境推荐使用HP LaserJet系列
  3. 异常处理

    try
    {// 打印操作
    }
    catch (PrintSystemException ex)
    {Debug.WriteLine($"打印系统错误: {ex.Message}");
    }
    catch (IOException ex)
    {Debug.WriteLine($"I/O错误: {ex.Message}");
    }
    

七、测试用例

测试场景预期结果
点击"打印预览"弹出预览窗口显示正确内容
选择不存在打印机弹出错误提示
连续打印10份生成10个独立打印任务
打印特殊字符正确显示Unicode字符

八、扩展应用场景

  1. 标签打印系统

    // Zebra打印机ZPL指令
    string zplCode = "^XA^FO50,50^A0N,25,25^FDHello World^FS^XZ";
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(zplCode)))
    {_selectedPrinter.AddJob("LabelJob", stream, true);
    }
    
  2. 多联单据打印

    // 设置多份副本
    _printDialog.PrintTicket.CopyCount = 3;
    _printDialog.PrintTicket.Duplexing = Duplexing.OneSided;
    
http://www.dtcms.com/a/398025.html

相关文章:

  • 储能材料:弹性势能储能及材料技术突破
  • RapidJSON 自定义内存分配器详解与实战
  • 深度学习-PyTorch 模型
  • WPF依赖属性学习
  • 云原生-高级阶段-利用rsync备份全网服务器数据
  • wordpress建购物网站抚顺营销型网站建设
  • Pythoner 的Flask项目实践-添加Shapefile面数据并展示功能Mapboxgl底图
  • Flutter混合Android开发Release 打包失败GeneratedPluginRegistrant.java,Plugin不存在
  • docker 安装TDengine 并创建新用户
  • 网站推广实施方案珠海网站制作软件
  • 为世界添彩 - WebGL 中的颜色与着色器变量
  • 初识MYSQL —— mysql的安装
  • c回顾 01
  • 【LeetCode 每日一题】3484. 设计电子表格——(解法一)二维数组
  • python+django/flask+springboot实践性教学系统 实训任务发布 学生作业提交 教师评阅管理系统
  • 洞悉未来,智驭不确定性:蒙特卡洛模拟决策模型实践
  • 长宁哪里有做网站优化比较好利润在100万到300万之间税率2021
  • 沈阳网站设计外包广西建设网官网桂建云
  • vscode 插件怎么实现编辑器行号处添加图标标记
  • Git 从零到一:以 Gitee 为例的实战与可视化指南
  • React 标准 SPA 项目 入门学习记录
  • HAProxy 完整指南:简介、负载均衡原理与安装配置
  • 领码课堂 | React 核心组件与高级性能优化全实战指南
  • 涡轮丝杆升降机的丝杆材质有哪些?
  • 前端笔记:vue中 Map、Set之间的使用和区别
  • 中美关系最新消息视频重庆seo优化公司
  • 【Cesium 开发实战教程】第六篇:三维模型高级交互:点击查询、材质修改与动画控制
  • 英雄联盟视频网站源码做产品设计之前怎么查资料国外网站
  • Vue3-接入飞书H5应用
  • 四川省建设厅网站川北医学院广告网站怎么建设