5

我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。

一个所谓的“DesignerPaginator”对图表进行分页(非常简单)。从这一点开始,我做了以下三件事: - 我使用 PrintDialog.PrintDocument(Paginator, Title) 打印文档 - 我还使用 XpsDocumentWriter.Write(Paginator, PrintTicket) 创建了一个 XPS 文档;我保存在硬盘上 - 从 XPSDocument 我将 XpsDocumentWriter.GetFixedDocumentSequence() 分配给 DocumentViewer

简而言之,以下代码很重要:

PrintDialog _pdialog = new PrintDialog();
System.Printing.ValidationResult result = this.PrintQueue.MergeAndValidatePrintTicket(this.PrintQueue.UserPrintTicket, this.PrintTicket);

_pdialog.PrintTicket = result.ValidatedPrintTicket;
XpsDocument _xpsDocument = new XpsDocument("C:\\test.xps",FileAccess.ReadWrite);
XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(_xpsDocument);
xpsdw.Write(this.Paginator, result.ValidatedPrintTicket);
documentviewer.Document = _xpsDocument.GetFixedDocumentSequence();
_xpsDocument.Close();

_pdialog.PrintQueue = this.PrintQueue;
_pdialog.PrintDocument(this.Paginator, "Model Test");

输出如下:

硬盘上的 XPS -> 绝对模糊。你什么都认不出来。它就像一个 100 倍缩放的 GIF 文件。DocumentViewer 中 XPSDocument 中的 FixedDocumentSequence -> Perfect。这应该是 XPS 文件的意思 打印输出 -> 可怕,模糊,但至少比 xps 文件好得多

现在是神秘的部分:如果我直接从 DocumentViewer 打印(其中 FixedDocumentSequence 看起来很完美),我会从第一次打印中得到相同的模糊输出。

我对这种情况的想法是 WPF 的 XPS 系统对内容进行光栅化,并将这些内容作为低质量位图放置在 xps 文档中。都是向量,尽管如此,输出对于低分辨率位图来说似乎总是很熟悉。

我将不胜感激任何帮助。我没主意了。我尝试了很多来调试这个问题,但不知何故,它似​​乎同时又简单又微妙。

4

1 回答 1

4

我发现了如何避免我的问题,但我不能保证该解决方案也适用于您的问题。事实上,似乎使用投影在您的 Visual 上的两个嵌套 VisualBrushes 会导致输出模糊。

我们在 wpf 打印中使用的一个 VisualBrush 是不可避免的:它是通过我们的 Paginator 应用来剪切 Visual 并将其分发到多个页面上的。我还有一个用作“模板”的 UserControl。我用我们图表的 VisualBrush 将一个 Rectangle 绘制到 UserControl 中,并且在此操作之后,UserControl 本身被分页器绘制为带有 VisualBrush 的 Rectangle 到页面上。由于 WPF 的打印路径使用 XPS 进行打印,您还可以创建一个 XPSDocument,将文件类型更改为 zip,解压缩并使用任何文本编辑器分析文档的一页。这将极大地帮助您了解您的问题。

我还怀疑当 VisualBrush 的内容没有以 Visual 具有的原始 1:1 高度/宽度比应用时,文档被“光栅化”了。调整大小计算中的错误导致应用的 VisualBrush 的高度/宽度比为 1:0.9948,这导致输出模糊(不包括“嵌套 VisualBrush”问题)。

这仍然只是一个怀疑。我的问题已通过排除“额外”的 VisualBrush 并尊重原始纵横比得到解决。也可以假设一个/或两个问题仅与某种视觉/效果/变换甚至线性画笔组合出现。

至少,当涉及到此类问题时,我学到了关于 WPF 打印路径的一件事:想想你的东西总是在后台转换为 xps 的事实,xps 类似于 wpf,但不支持 wpf 所做的任何事情. 事实上,如果我没有误解的话,XPS 是 WPF 中 XAML 的灵感来源。

我也非常欢迎对这个问题提出任何真正的答案。我的问题解决了,但我想知道为什么会这样。

于 2009-10-02T12:26:59.777 回答