先说一下思路:把控件保存为图片,然后把图片保存为xps文件,然后打印xps文件。保存为xps文件,下次再打印就不用重新调整打印设置了。
控件保存为图片的方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
打印
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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;