zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/LCHL/p/2582777.html
Copyright © 2011-2022 走看看