• Silverlight之打印


    Silverlight中的打印只有一个类,那就是PrintDocment这个对象来实现。
    下面我用两种方法来实现Silverlight的打印:
    第一种:

    private void btnPrint_Click(object sender, RoutedEventArgs e)
            {
                PrintDocument document = new PrintDocument();
    
                // tell the API what to print
                document.PrintPage += (s, args) =>
                {
                    args.PageVisual = GPrint;
                };
    
                // call the Print() with a proper name which will be visible in the Print Queue
                document.Print("Silverlight Print Application Demo");
            }

    第二种:
    实现方式也很简单,其实只需两个步骤即可完成,即绑定PrintDocument的PrintPage事件和调用Print方法。

    PrintDocument document = new PrintDocument();
    document.PrintPage += documentImage_PrintPage;
    document.Print("Image Document");

    这个就完成了一个打印,其中PrintPage事件是最为重要的,因为整个打印的工作都是在这个事件中完成的,另外该事件的参数 PrintPageEventArgs构成了整个打印过程中的属性的设置;Print方法需要传递一个参数,参数为打印的文件的名称,在调用该方法的时候 开始触发一系列的打印事件。
    PrintPageEventArgs类型的属性:
    PrintableArea:获取一个Size类型的值,表示打印的范围,分别表示Height和Width,如果打印的部分超出了区域,则被截取。
    PageMargins:获取打印页的Margin值。
    PageVisual:设置要打印的对象,可以是一个TextBlock、Image,也可以是一个复杂的元素(Grid或者Canvas)。
    HasMorePages:一个bool值,标识是否多页。
    一个简单的例子:

           private void btnPrintImage_Click(object sender, RoutedEventArgs e)
            {
                PrintDocument document = new PrintDocument();
                document.PrintPage += new EventHandler<PrintPageEventArgs>(document_PrintPage);
                document.Print("Print Image");
            }
    
            void document_PrintPage(object sender, PrintPageEventArgs e)
            {
                Image imagePrint = new Image();
                imagePrint.Source = img.Source;
                imagePrint.Height = e.PrintableArea.Height;
                imagePrint.Width = e.PrintableArea.Width;
                e.PageVisual = imagePrint;
                e.HasMorePages = false;
            }

    分页打印的例子:

     //当前打印的行的索引,用于遍历ListBox.Items
            private int listPrintIndex;
            private void btnPrintList_Click(object sender, RoutedEventArgs e)
            {
                //初始值为0
                listPrintIndex = 0;
                PrintDocument document = new PrintDocument();
                document.PrintPage += new EventHandler<PrintPageEventArgs>(document_PrintPage);
                document.Print("Print List");
            }
    
            //设置每一项之间的间距
            private int extraMargin = 50;
            void document_PrintPage(object sender, PrintPageEventArgs e)
            {
                //定义一个打印的元素
                Canvas printSurface = new Canvas();
                e.PageVisual = printSurface;
                //得到最顶端位置
                double topPosition = e.PageMargins.Top + extraMargin;
    
                //遍历当前的ListBox.Items
                while (listPrintIndex<lstPrint.Items.Count)
                {
                    //实例化TextBlock用来存放ListItem的值
                    TextBlock txt = new TextBlock();
                    txt.FontSize = 30;
                    //得到ListBox每一项的值
                    txt.Text = lstPrint.Items[listPrintIndex].ToString();
                    double measuredHeight = txt.ActualHeight;
                    //如果打印的当前行高度不合适的话,则进行分页
                    if (measuredHeight>(e.PrintableArea.Height- topPosition- extraMargin))
                    {
                        e.HasMorePages = true;
                        return ;
                    }
    
                    //设置TextBlock在Canvas中的位置
                    txt.SetValue(Canvas.TopProperty, topPosition);
                    txt.SetValue(Canvas.LeftProperty, e.PageMargins.Left + extraMargin);
                    //将TextBlock添加到打印的元素中去
                    printSurface.Children.Add(txt);
    
                    listPrintIndex++;
                    //追加高度
                    topPosition = topPosition + measuredHeight;
                }
                e.HasMorePages = false;
            }

    有时我们会发现打印的图片并不完整,这样就需要一个类:

     public static class Extensions
        {
            public static void Print(this FrameworkElement element,
              string Document, HorizontalAlignment HorizontalAlignment,
              VerticalAlignment VerticalAlignment, Thickness PageMargin,
              bool PrintLandscape, bool ShrinkToFit, Action OnPrintComplete)
            {
                Print(new List<FrameworkElement>() { element }, Document,
                      HorizontalAlignment, VerticalAlignment, PageMargin,
                     PrintLandscape, ShrinkToFit, OnPrintComplete);
            }
    
            public static void Print<T>(this List<T> elements,
                    string Document, HorizontalAlignment HorizontalAlignment,
                    VerticalAlignment VerticalAlignment, Thickness PageMargin,
                    bool PrintLandscape, bool ShrinkToFit, Action OnPrintComplete)
            {
                PrintDocument printDocument = new PrintDocument();
                PageMargin = PageMargin == null ? new Thickness(10) : PageMargin;
                Document = (string.IsNullOrEmpty(Document)) ? "Print Document" : Document;
                int currentItemIndex = 0;
                printDocument.PrintPage += (s, e) =>
                {
                    if (!typeof(FrameworkElement).IsAssignableFrom(elements[currentItemIndex].GetType()))
                    {
                        throw new Exception("Element must be an " +"object inheriting from FrameworkElement");
                    }
    
                    FrameworkElement element = elements[currentItemIndex] as FrameworkElement;
    
                    if (element.Parent == null || element.ActualWidth == double.NaN ||element.ActualHeight == double.NaN)
                    {
                        throw new Exception("Element must be rendered, " +
                                  "and must have a parent in order to print.");
                    }
    
                    TransformGroup transformGroup = new TransformGroup();
    
                    //First move to middle of page...  首先移动到页面的中间
                    transformGroup.Children.Add(new TranslateTransform()   //TranslateTransform偏移动画
                   {
                       X = (e.PrintableArea.Width - element.ActualWidth) / 2,
                       Y = (e.PrintableArea.Height - element.ActualHeight) / 8
                   });
                    double scale = 1;
                    if (PrintLandscape)   //如果打印空白  需要旋转
                    {
                        //Then, rotate around the center   然后旋转到中心
                        transformGroup.Children.Add(new RotateTransform()
                        {
                            Angle = 90,
                            CenterX = e.PrintableArea.Width / 2,
                            CenterY = e.PrintableArea.Height / 2
                        });
    
                        if (ShrinkToFit)   //如果自适应大小
                        {
                            if ((element.ActualWidth + PageMargin.Left +PageMargin.Right) > e.PrintableArea.Height)  //如果宽度大于纸张的高度
                            {
                                //Math.Round 方法 将值舍入到最接近的整数或指定的小数位数。 
                                scale = Math.Round(e.PrintableArea.Height /(element.ActualWidth + PageMargin.Left + PageMargin.Right), 2);
                            }
                            if ((element.ActualHeight + PageMargin.Top + PageMargin.Bottom) > e.PrintableArea.Width) //如果高度大于纸张的宽度
                            {
                                double scale2 = Math.Round(e.PrintableArea.Width /(element.ActualHeight + PageMargin.Top + PageMargin.Bottom), 2);
                                scale = (scale2 < scale) ? scale2 : scale;
                            }
                        }
                    }
                    else if (ShrinkToFit)  //如果不打印空白并自适应大小  不需要旋转
                    {
                        //Scale down to fit the page + margin
                        if ((element.ActualWidth + PageMargin.Left + PageMargin.Right) > e.PrintableArea.Width) //如果宽度大于纸张的宽度
                        {
                            scale = Math.Round(e.PrintableArea.Width /(element.ActualWidth + PageMargin.Left + PageMargin.Right), 2);
                        }
                        if ((element.ActualHeight + PageMargin.Top + PageMargin.Bottom) > e.PrintableArea.Height) //如果高度大于纸张的高度
                        {
                            double scale2 = Math.Round(e.PrintableArea.Height /(element.ActualHeight + PageMargin.Top + PageMargin.Bottom), 2);
                            scale = (scale2 < scale) ? scale2 : scale;
                        }
                    }
    
                    //Scale down to fit the page + margin
                    if (scale != 1)
                    {
                        transformGroup.Children.Add(new ScaleTransform()  //ScaleTransform缩放动画
                        {
                            ScaleX = scale,
                            ScaleY = scale,
                            CenterX = e.PrintableArea.Width / 2,
                            CenterY = e.PrintableArea.Height / 2
                        });
                    }
    
                    if (VerticalAlignment == VerticalAlignment.Top)
                    {
                        //Now move to Top
                        if (PrintLandscape)
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = 0,
                                Y = PageMargin.Top - (e.PrintableArea.Height -(element.ActualWidth * scale)) / 2
                            });
                        }
                        else
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = 0,
                                Y = PageMargin.Top - (e.PrintableArea.Height -(element.ActualHeight * scale)) / 2
                            });
                        }
                    }
                    else if (VerticalAlignment == VerticalAlignment.Bottom)
                    {
                        //Now move to Bottom
                        if (PrintLandscape)
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = 0,
                                Y = ((e.PrintableArea.Height -(element.ActualWidth * scale)) / 2) - PageMargin.Bottom
                            });
                        }
                        else
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = 0,
                                Y = ((e.PrintableArea.Height -(element.ActualHeight * scale)) / 2) - PageMargin.Bottom
                            });
                        }
                    }
    
                    if (HorizontalAlignment == HorizontalAlignment.Left)
                    {
                        //Now move to Left
                        if (PrintLandscape)
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = PageMargin.Left - (e.PrintableArea.Width -(element.ActualHeight * scale)) / 2,
                                Y = 0
                            });
                        }
                        else
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = PageMargin.Left - (e.PrintableArea.Width -(element.ActualWidth * scale)) / 2,
                                Y = 0
                            });
                        }
                    }
                    else if (HorizontalAlignment == HorizontalAlignment.Right)
                    {
                        //Now move to Right
                        if (PrintLandscape)
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = ((e.PrintableArea.Width -(element.ActualHeight * scale)) / 2) - PageMargin.Right,
                                Y = 0
                            });
                        }
                        else
                        {
                            transformGroup.Children.Add(new TranslateTransform()
                            {
                                X = ((e.PrintableArea.Width -(element.ActualWidth * scale)) / 2) - PageMargin.Right,
                                Y = 0
                            });
                        }
                    }
    
                    e.PageVisual = element;
                    e.PageVisual.RenderTransform = transformGroup;
    
                    //Increment to next item,
                    currentItemIndex++;
    
                    //If the currentItemIndex is less than the number of elements, keep printing
                    e.HasMorePages = currentItemIndex < elements.Count;
                };
    
                printDocument.EndPrint += delegate(object sender, EndPrintEventArgs e)
                {
                    foreach (var item in elements)
                    {
                        FrameworkElement element = item as FrameworkElement;
                        //Reset everything...
                        TransformGroup transformGroup = new TransformGroup();
                        transformGroup.Children.Add(new ScaleTransform() { ScaleX = 1, ScaleY = 1 }); //缩放动画
                        transformGroup.Children.Add(new RotateTransform() { Angle = 0 });             //旋转动画
                        transformGroup.Children.Add(new TranslateTransform() { X = 0, Y = 0 });       //偏移动画
                        element.RenderTransform = transformGroup;
                    }
    
                    //Callback to complete
                    if (OnPrintComplete != null)
                    {
                        OnPrintComplete();
                    }
                };
    
                printDocument.Print(Document);
            }
        }

    调用这个类:

    private void btnPrint_Click(object sender, RoutedEventArgs e)
            {
                    Extensions.Print(GPrint, "MyPrint",
                    HorizontalAlignment.Center, VerticalAlignment.Top,
                    new Thickness(10, 0, 10, 0), true, true, null);
             }

    这样就能完整的打印了,不过打印出来的效果可能是横向的。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,并在文章页面明显位置以超链接形式注明出处,否则保留追究法律责任的权利。

  • 相关阅读:
    linux基础命令1
    linux下nginx搭建
    linux 对外开放端口
    linux下mysql 登录修改密码与数据库备份
    linux下mysql部署
    linux下mysql启动 Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)
    aptitude软件状态标志i、v、p
    GNU各软件版本历史站点
    glibc库和glib库
    禁用ipv6的两种方法
  • 原文地址:https://www.cnblogs.com/jiajiayuan/p/2444246.html
Copyright © 2020-2023  润新知