gpt4 book ai didi

c# - 是什么导致 WPF 打印机输出被栅格化?

转载 作者:太空狗 更新时间:2023-10-29 20:18:12 25 4
gpt4 key购买 nike

我在 WPF 中遇到过很多打印问题,其中正在打印的项目的特定组合会突然触发打印机输出的光栅化(导致丑陋和巨大的打印机输出,并可能导致打印每页需要 30 秒)。我发现在控件上设置任何级别的不透明度通常会触发此操作。我忘记了它的其他所有功能(我相信使用打开剪裁的 Canvas 也可以做到这一点),但现在我遇到了另一个问题,即带有填充边框的平铺画笔的堆栈面板......等等。 . 现在再次导致这种光栅化。

因此,在我再次四处寻找试图弄清楚是什么触发了什么等之前,我想知道是否有人知道关于哪些特定项目可能触发此事件的权威信息来源?或者也许可以通过某种方式连接到发生这种情况的系统,让我至少尝试弄清楚......

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

更新:我今天发现仅在 Canvas 中包含图像也会导致它被栅格化。不总是,但有时。可能与大小有关,或者可能与裁剪有关,等等。啊。

我经常打印成 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;
}

完整的测试应用程序可以从here 下载。 (VS 2010 解决方案)。

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

结果截图如下: wpf printing rasterization testapp result当您放大 PDF 时,您会看到矩形和椭圆不再是矢量格式并且变得模糊。


光栅化条件

这似乎很难定义。我和 boomhauer 有同样的经历,不透明度和裁剪似乎很频繁地触发光栅化。我的例子确实包括了这两个(在尝试触发光栅化时故意使用它们)。并不是说要发生光栅化就需要存在任何这些。

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

解决方法

我发现生成 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();
}

截图 here .

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

这当然有点乱七八糟,不是最佳解决方案。但是如果没有找到修复或真正的解决方案(我自己还没有尝试过),如果有人有一个从 Microsoft XPS 查看器强制打印的好方法,我会很感兴趣。

我也很想知道即使从 Microsoft XPS Viewer 打印时是否有人仍然遇到光栅化打印输出。

从长远来看,我尝试在我的测试应用程序中加载 XPS 文件并打印它 (code)。但这没有用,仍然得到光栅化打印输出。

解决方案?

我认为这不是打印机驱动程序问题。当发生光栅化时,它会出现在所有打印机上,无一异常(exception)。我尝试了 4-5 种不同的打印机,从 100 美元的 HP 1020 到 6000 美元的 Konica Minolta C360 和一些虚拟打印机。

解决方法还表明 Microsoft XPS 查看器 向打印机驱动程序发送的内容与直接 WPF 打印发送的内容不同。

我们真的应该让微软看看这个,它被归档为 bug回到 2009 年,但什么也没有发生。希望重现问题的简洁代码示例会有所帮助。

关于c# - 是什么导致 WPF 打印机输出被栅格化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com