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;

  • 相关阅读:
    json_encode不编码中文字符的方式
    网站备份脚本
    英语动词大全
    多线程和多进程的区别【转载网络】
    解决curl中errno为51和60的错误
    ps修改图片文字
    如何设计充值消费的数据表
    LoRa与NB-IoT对比(转载)
    vuejs 使用vue-cli引入bootstrap
    关于防火墙的规则
  • 原文地址:https://www.cnblogs.com/LCHL/p/2582777.html
Copyright © 2011-2022 走看看