Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是什么导致WPF打印机输出光栅化?_C#_Wpf_Xaml_Printing - Fatal编程技术网

C# 是什么导致WPF打印机输出光栅化?

C# 是什么导致WPF打印机输出光栅化?,c#,wpf,xaml,printing,C#,Wpf,Xaml,Printing,我在WPF中遇到了许多打印问题,其中正在打印的项目的特定组合会突然触发打印机输出的光栅化(导致丑陋和巨大的打印机输出,并可能导致打印每页需要30秒)。我发现,通常情况下,在控件上设置任何级别的不透明度都会触发这种情况。我忘记了所有其他的方法(我相信使用打开剪辑的画布也能做到),但现在我遇到了另一个问题,一个stackpanel,一个平铺的imagebrush填充了一个边框。。。等现在又导致了这种光栅化 所以,在我再次尝试找出什么触发了什么等之前,我想知道是否有人知道关于哪些特定项目可能触发这种情

我在WPF中遇到了许多打印问题,其中正在打印的项目的特定组合会突然触发打印机输出的光栅化(导致丑陋和巨大的打印机输出,并可能导致打印每页需要30秒)。我发现,通常情况下,在控件上设置任何级别的不透明度都会触发这种情况。我忘记了所有其他的方法(我相信使用打开剪辑的画布也能做到),但现在我遇到了另一个问题,一个stackpanel,一个平铺的imagebrush填充了一个边框。。。等现在又导致了这种光栅化

所以,在我再次尝试找出什么触发了什么等之前,我想知道是否有人知道关于哪些特定项目可能触发这种情况的确切信息来源?或者也许是某种方法,让我至少试着去弄清楚发生这种事情的系统

到目前为止,这是我在WPF工作数年中最令人沮丧的部分

更新:我今天发现,仅仅在画布中包含一个图像也会导致它变得光栅化。不是始终如一,但有时。可能与大小有关,或者是否裁剪过,等等。啊


我经常打印到PDF文件,但我发现adobe acrobat打印机和其他物理打印机之间的行为几乎相同

我也为这个问题挣扎了一段时间。本周,我再次开始研究这个问题,并开始编写一个小型测试应用程序来隔离这个问题。我只需要几次绘图操作就可以触发光栅化。 四个矩形,一个椭圆和一条直线

static void Main(string[] args)
{
    var printers = new LocalPrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
    PrintQueue defaultPrinter = LocalPrintServer.GetDefaultPrintQueue();
    PrintQueue printerToUse = printers.FirstOrDefault(p => p.Name.Contains("PDFCreator")) ?? defaultPrinter; // Use PDFCreator if available.
    PrintTicket ticket = printerToUse.DefaultPrintTicket;
    XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printerToUse);
    writer.Write(CreateVisual(), ticket);
}

private static Visual CreateVisual()
{
    var visual = new DrawingVisual();
    using (DrawingContext dc = visual.RenderOpen())
    {
        var pen = new Pen(Brushes.Black, 3);
        var opacityBrush = new SolidColorBrush { Color = Colors.Violet, Opacity = 0.7 };
        dc.PushClip(new RectangleGeometry(new Rect(20, 20, 150, 150)));
        dc.DrawLine(pen, new Point(0, 0), new Point(200, 300));
        dc.DrawEllipse(new SolidColorBrush(Colors.LightGreen), pen, new Point(50, 80), 50, 70);
        dc.DrawRectangle(new SolidColorBrush(Colors.LightBlue), pen, new Rect(10, 100, 100, 100));
        dc.DrawRectangle(new SolidColorBrush(Colors.LightPink), pen, new Rect(40, 120, 100, 100));
        dc.DrawRectangle(new SolidColorBrush(Colors.LightGray), pen, new Rect(60, 140, 100, 100));
        dc.DrawRectangle(opacityBrush, pen, new Rect(80, 160, 100, 100));
    }

    return visual;
}
完整的测试应用程序可以从(VS 2010解决方案)下载

测试时,我正在打印到一个虚拟PDF打印机,以防止大量纸张使用。但我用真正的物理打印机得到了同样的结果。使用这个例子很难注意到纸面上的差异,但是,现实世界中的情况可能更明显(,)

以下是结果的屏幕截图: 放大PDF时,您会看到矩形和椭圆不再是矢量格式,并且变得模糊


光栅化条件 这似乎很难定义。我和布姆豪尔有同样的经历,不透明度和剪切似乎经常触发光栅化。我的例子确实包括了这两个方面(在尝试触发光栅化时故意使用它们)。并不是说,任何这些都需要出现光栅化

不透明可能会导致光栅化,这是有道理的,但您认为与此问题无关的其他一些细微变化实际上可以“阻止”光栅化的发生。比如在我的例子中改变钢笔的厚度()。以某种方式删除光栅化条件的其他更改是更改绘图操作的顺序,删除任何操作,当然还删除不透明度或剪裁

变通办法 我发现,生成XPS文件并从Microsoft XPS Viewer打印它实际上会产生无光栅输出,即使使用的是完全相同的图形和打印机

private static void GenerateXps()
{
    var xpsDoc = new XpsDocument("wpf_printing_raster_test.xps", FileAccess.ReadWrite);
    XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
    writer.Write(CreateVisual());
    xpsDoc.Close();
}
截图

因此,您可以生成XPS och,然后以编程方式指示Microsoft XPS Viewer为您打印XPS,而不是直接从代码中打印

这当然是一个小技巧,不是一个最佳的解决方案。但是,如果有人有一个很好的方法,可以在没有找到修复或真正的解决方案(我自己还没有尝试过)的情况下从Microsoft XPS Viewer强制打印,我会很感兴趣

我还想知道是否有人在从Microsoft XPS Viewer打印时仍会遇到光栅化打印输出

最后,我尝试在测试应用程序中加载XPS文件并打印()。但这不起作用,仍然得到光栅化打印输出

解决方案 我不认为这是打印机驱动程序的问题。光栅化发生时,在所有打印机上都会发生,没有例外。我试过4-5种不同的打印机,从100美元的HP 1020到6000美元的Konica Minolta C360,还有一些虚拟打印机

该解决方案还指出,Microsoft XPS Viewer向打印机驱动程序发送的内容与直接WPF打印不同


我们真的应该试着让微软看看这一点,它在2009年作为一个文件提交,但什么都没有发生。希望通过一个简单的代码示例来重现这个问题会有所帮助。

只是一个想法,您提到您使用了imagebrush,它输出光栅数据。我没有在WPF中进行任何打印,但我想知道如果只是为整个打印区域生成位图,您是否有一些光栅数据,如图像或ImageBrush?它会有所不同-如果我使用平铺笔刷将部分保持相对较小,它似乎会将第一页光栅化,而不是后续页面。如果它更大,那么每个页面都会被光栅化。再一次,由于不一致而令人沮丧。我很惊讶地看到没有人试图回答这个问题,我想可能会有一些沮丧的wpf黑客提供一些信息;)我误解了“光栅化”对提问者的意义。对提问者来说,这意味着“造成丑陋和巨大的打印机输出,并可能导致打印每页需要30秒”,而对我来说,这意味着将几何实体转换为像素。我删除了我的答案,因为它与问题无关,你的答案更好。伟大的研究证实了我的许多发现。感觉上我们是唯一两个解决这个问题的人吗?;)我还想补充一点——我相信尝试使用xps查看器打印输出通常会破坏分页等功能。如果我没记错的话,似乎很少有人用wpf打印,或者公司对他们如何解决这个问题保密。。。我感到奇怪的是,这种情况发生在Windows8 onlyNice研究中心:同样的解决方法也适用于Microsoft Print to