打印固定文档WPF打印质量- Windows 10/8 vs Windows 7

10

我目前正在尝试使用PrintFixedDocument打印一个内容容器的内容(它只包含带有信息的数据网格)和一张图片。在我的机器上(Windows 10)以及另一台运行Windows 8的PC上,它的打印质量非常好。

但是,在Windows 7 PC上执行此操作时,图像质量变得非常差,最终结果非常模糊。这是一个问题,因为由于各种原因,该计算机不能从Windows 7进行更新,所以我想知道是否有其他人经历过这种情况,如果有,是否有解决方法?还可能与我的GetFixedDocument方法有关,但我无法弄清楚为什么这可以在win 10和8上运行,但不适用于win 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#: public partial class CouponViewerView { // CouponViewerView的构造函数 public 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;
        }

就算只是为了好玩,虽然我相信你可能已经检查过了。你有没有检查过win7机器的设置,确保它没有在草稿模式下打印或进行任何手动调整大小等操作,并确保任何打印驱动程序都是最新的? - Chris W.
是的,我已经排除了所有常见问题。在所有打印机上都可以以高质量进行打印,并且所有驱动程序都是最新的。这真的很奇怪,因为我从未见过这样的情况。 - philmckendry
是的,我知道他们对驱动程序包和其他东西进行了一些更改,试图诱使制造商停止加载一堆OEM垃圾软件,但据我所知,无论操作系统版本如何,它都应该以相同的方式被处理。这很有趣。 - Chris W.
我会考虑这个建议,但这不太可能影响打印的质量吧? - philmckendry
也许是这样。据我所知,XPS被内部转换为GDI打印命令。我还曾遇到过更复杂的绘图和视觉笔刷打印输出的速度和质量问题。 - SnowballTwo
显示剩余3条评论
2个回答

0

还有其他人遇到过这个问题吗?如果是的话,是否有解决方法?

这是唯一可以直接回答的问题,是的,很多人都遇到过。请记住,在打印机上,您经常会对图像进行大幅缩放,因为它们与显示器相比具有非常高的每英寸点数分辨率。运行Win7的计算机通常以96dpi的分辨率运行,后来的计算机通常配备更好的显示器,因此通常以更高的dpi设置运行。首先要注意的是源图像。如果其像素大小足够适合该Win7 PC,则在将其放大到600 dpi时可能会变得非常模糊。

在WPF中,最令人费解的缩放行为可能是当图像对齐与目标像素不完全匹配时会发生什么。这个问题在这篇博客文章中有很好的描述。一定要阅读这个 SO 问题,它几乎完美地解决了您使用VisualBrush及其模糊问题的问题。这个问题已在.NET 4.0中通过添加UseLayoutRounding属性得到解决。如果您没有使用它,那么您肯定应该使用它。不要盲目地应用dup推荐的BitmapScalingMode,图像类型(线条艺术 vs 照片)非常重要。


好的,谢谢你的回答。这给了我很多东西去研究,以便解决这个问题。 - philmckendry

0

我曾经遇到过类似的问题,最终我选择创建一个PDF文件并让客户打印,这样就可以很好地解决了。

Windows 7在一些WPF打印方面似乎存在问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接