WPF 打印
先说一下思路:把控件保存为图片,然后把图片保存为xps文件,然后打印xps文件。保存为xps文件,下次再打印就不用重新调整打印设置了。
控件保存为图片的方法:

1 //提取控件中的图像 2 RenderTargetBitmap bmp = new RenderTargetBitmap((int)控件.ActualWidth, (int)控件.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); 3 bmp.Render(控件); 4 BitmapEncoder encoder = new PngBitmapEncoder(); 5 encoder.Frames.Add(BitmapFrame.Create(bmp)); 6 7 string path = "指定文件路径 *.png"; 8 9 using (FileStream file = new FileStream(path , FileMode.Create, FileAccess.Write)) 10 { 11 encoder.Save(file); 12 }
保存xps的方法

1 string path = "Data/xps/" + imgId + ".xps"; 2 if (!Directory.Exists( "Data/xps")) 3 Directory.CreateDirectory("Data/xps"); 4 5 PageContent pageContent = new PageContent(); 6 FixedPage fixedPage = new FixedPage(); 7 Image img = new Image(); 8 img.Width = App.Photo_Width; 9 img.Height = App.Photo_Height; 10 img.Stretch = Stretch.Fill; 11 12 img.Source = Printer.GetImage( "Data/NotePhotos/" + imgId + ".png"); 13 FixedPage.SetLeft(img, 0); 14 FixedPage.SetTop(img, 0); 15 fixedPage.Width = App.Photo_Height; 16 fixedPage.Height = App.Photo_Width; 17 img.RenderTransformOrigin = new Point(App.Photo_Height / (2 * App.Photo_Width), 0.5); 18 img.RenderTransform = new RotateTransform(90); 19 20 fixedPage.Children.Add((UIElement)img); 21 Size sz = new Size(App.Photo_Height, App.Photo_Width); 22 fixedPage.Measure(sz); 23 fixedPage.Arrange(new Rect(new Point(), sz)); 24 fixedPage.UpdateLayout(); 25 ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); 26 27 XpsDocument doc = new XpsDocument(path, FileAccess.Write); 28 XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); 29 writer.Write(fixedPage); 30 doc.Close();
上面的GetImage方法

1 /// <summary> 2 /// 把文件读取到内存中,这样可以对文件进行其他操作 3 /// </summary> 4 /// <param name="url"></param> 5 /// <returns></returns> 6 public static BitmapSource GetImage(string url) 7 { 8 try 9 { 10 using (BinaryReader reader = new BinaryReader(File.Open(url, FileMode.Open))) 11 { 12 FileInfo fi = new FileInfo(url); 13 byte[] bytes = reader.ReadBytes((int)fi.Length); 14 reader.Close(); 15 BitmapImage bitmapImage = new BitmapImage(); 16 bitmapImage.BeginInit(); 17 bitmapImage.StreamSource = new MemoryStream(bytes); 18 bitmapImage.EndInit(); 19 bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 20 return bitmapImage; 21 } 22 } 23 catch { return null; } 24 }
打印

1 /// <summary> 2 /// 打印(使用默认打印机) 3 /// </summary> 4 /// <param name="imgId">要打印的图片编号</param> 5 /// <param name="width">宽度</param> 6 /// <param name="height">高度</param> 7 public static void Print(string imgId) 8 { 9 10 //获取选中项 11 if (imgId != string.Empty) 12 { 13 string path = "Data/xps/" + imgId + ".xps"; 14 if (File.Exists(path)) 15 { 16 //LocalPrintServer ps = new LocalPrintServer(); 17 //如果已存在该文件,则打印 使用系统默认打印机 18 PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 19 try { PrintSystemJobInfo xpsPringtJob = defaultPrintQueue.AddJob(imgId + ".xps", path, false); } 20 catch { } 21 defaultPrintQueue.Dispose(); 22 } 23 else 24 { 25 PageContent pageContent = new PageContent(); 26 FixedPage fixedPage = new FixedPage(); 27 28 Image img = new Image(); 29 img.Width = Photo_Width; 30 img.Height = Photo_Height; 31 img.Stretch = Stretch.Fill; //Stretch.Fill; 32 img.Source = GetImage("Data/NotePhotos/" + imgId + ".png"); 33 34 FixedPage.SetLeft(img, 0); 35 FixedPage.SetTop(img, 0); 36 fixedPage.Width = Photo_Height; 37 fixedPage.Height =Photo_Width; 38 img.RenderTransformOrigin = new Point((Photo_Height / 2) / Photo_Width, 0.5); 39 img.RenderTransform = new RotateTransform(90);//旋转调整图片 40 fixedPage.Children.Add((UIElement)img); 41 42 Size sz = new Size(Photo_Height, Photo_Width); 43 fixedPage.Measure(sz); 44 fixedPage.Arrange(new Rect(new Point(), sz)); 45 fixedPage.UpdateLayout(); 46 ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); 47 48 XpsDocument doc = new XpsDocument(path, FileAccess.Write); 49 XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); 50 writer.Write(fixedPage); 51 doc.Close(); 52 PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 53 54 try { PrintSystemJobInfo xpsPringtJob = defaultPrintQueue.AddJob(imgId + ".xps", path, false); } 55 catch { } 56 defaultPrintQueue.Dispose(); 57 } 58 } 59 60 }
需要引用的一些命名空间:
using System.Printing;
using System.IO;
using System.Windows.Documents;
using System.Windows.Xps.Packaging;//添加引用=》ReachFramework
using System.Windows.Xps;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?