PrintFixedDocument wpf打印质量 - Windows 10/8 vs Windows 7

时间:2015-12-11 14:41:10

标签: c# wpf windows xaml

我目前正在尝试使用PrintFixedDocument打印内容容器的内容(它只包含带有信息的数据网格)和图像。它在我的机器(Windows 10)上完美打印,具有完整的图像质量,在另一台PC 8上,质量相同。

然而,当在Windows 7 pc上完成此操作时,图像质量变得非常差,最终结果非常模糊。这是一个问题,因为计算机由于各种原因无法从Windows 7更新,所以我想知道是否有其他人经历过这个,如果有的话有解决方法吗?我的GetFixedDocument方法也可能是一个问题,虽然我无法弄清楚为什么这对win 10和8都有效,但不是7。

注意这是从每台PC上的应用程序的安装版本运行

还在所有3个操作系统上的多个打印机上进行了操作

任何帮助将不胜感激

的Xaml:

            <StackPanel Margin="-105,146,66,0" Height="900" VerticalAlignment="Top"  x:Name="PrintImageContextMenu">
                <Image Canvas.ZIndex="0" Source="{Binding Coupon.OverlayImagePath}"  Margin="0,-21,-76,108" Stretch="Fill"  />

                <ContentControl Content="{Binding}"  ContentTemplateSelector="{StaticResource DataViewerDataTemplateSelector}"  />

            </StackPanel>

C#:      公共部分类CouponViewerView     {         公共CouponViewerView()         {             的InitializeComponent();         }

    public void Print()
    {
        //Executes On Thread
        Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate
        {
            UpdateLayout();

            var fixedDoc = PrintHelper.GetFixedDocument(StackPanelToPrint, new PrintDialog());

            PrintHelper.ShowPrintPreview(fixedDoc);


        }, null, null);



    }

    private void PrintCurrentForm(object sender, RoutedEventArgs e)
    {
        Print();
    }

C#打印助手代码:

 public static void ShowPrintPreview(FixedDocument fixedDoc)
        {
            var wnd = new Window();
            var viewer = new DocumentViewer();
            viewer.Document = fixedDoc;
            wnd.Content = viewer;
            wnd.ShowDialog();
        }


  public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog)
        {
            var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
            var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
            var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
            var fixedDoc = new FixedDocument();
            //If the toPrint visual is not displayed on screen we neeed to measure and arrange it  
            toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
            //  
            var size = toPrint.DesiredSize;
            //Will assume for simplicity the control fits horizontally on the page  
            double yOffset = 0;
            while (yOffset < size.Height)
            {
                var vb = new VisualBrush(toPrint)
                {
                    Stretch = Stretch.None,
                    AlignmentX = AlignmentX.Left,
                    AlignmentY = AlignmentY.Top,
                    ViewboxUnits = BrushMappingMode.Absolute,
                    TileMode = TileMode.None,
                    Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height)
                };
                var pageContent = new PageContent();
                var page = new FixedPage();
                ((IAddChild)pageContent).AddChild(page);
                fixedDoc.Pages.Add(pageContent);
                page.Width = pageSize.Width;
                page.Height = pageSize.Height;
                var canvas = new Canvas();
                FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
                FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
                canvas.Width = visibleSize.Width;
                canvas.Height = visibleSize.Height;
                canvas.Background = vb;
                page.Children.Add(canvas);
                yOffset += visibleSize.Height;
            }
            return fixedDoc;
        }

2 个答案:

答案 0 :(得分:0)

  

其他人都经历过这种情况,如果有的话有解决方法吗?

这是唯一可以直接回答的问题,是的,很多。请记住,您经常在打印机上大幅度重新缩放图像,与显示器相比,它们是具有非常高的每英寸点数分辨率的设备。引导Win7的机器通常以96dpi运行,后来的机器往往具有更好的显示器,因此通常以更高的dpi设置运行。首先要注意的是源图像。如果它的像素大小足以满足Win7 PC的要求,那么当它被炸成600 dpi时会变得非常模糊。

WPF中最不直观的缩放行为可能是在缩放后图像对齐与目标像素不完全匹配时发生的情况。 this blog post中描述的问题很好。请务必阅读this SO question,这非常适合您使用VisualBrush及其模糊问题。在.NET 4.0中使用添加的UseLayoutRounding属性解决了此问题。你没有使用它,你绝对应该。不要盲目地应用dup推荐的BitmapScalingMode,图像的类型(线条艺术与照片)非常重要。

答案 1 :(得分:0)

我遇到了类似的问题,而不是直接打印到创建PDF并为客户打开,如果他们想要的话,他们可以打印出来。

Windows 7似乎因某些WPF打印而破裂。