WPF 打印

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

控件保存为图片的方法:

View Code
 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的方法

View Code
 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方法

View Code
 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         }

 

打印

View Code
 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;

posted @ 2012-07-09 15:09  疯狂的懒羊羊  阅读(1999)  评论(4编辑  收藏  举报