wpf - 通过分页器保存和打印 XPSDocument(似乎)会导致内容光栅化

标签 wpf printing document xps paginator

我使用 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");

输出如下:

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

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

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

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

最佳答案

我找到了如何避免我的问题,但我不能保证该解决方案也适用于您的问题。
事实上,使用两个嵌套的 VisualBrush 投影到您的 Visual 上,您使用的结果似乎是模糊的输出。

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

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

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

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

我也非常欢迎对此问题的任何真正答案 .我的问题解决了,但我想知道它为什么会发生。

关于wpf - 通过分页器保存和打印 XPSDocument(似乎)会导致内容光栅化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176565/

相关文章:

c++ - 有没有可以查看XPS文档的C++代码?

c# - 我如何对 wpf 应用程序中从 sleep 模式唤醒的窗口使用react?

html - 当单元格具有 rowspan 和 colspan 时,Chrome 表格会出现故障

javascript - UIWebVIew Javascript Document.location

c# - 如何在可由另一个线程更改的 IEnumerable 上安全地调用 Count(Func)?

c# - 如何自动将布局加载到我的 AvalonDock 实例中?

javascript - 将当前网页复制到新窗口

html - 打印时为每页添加边框,没有任何边框中断

javascript - 文档 cookie/出现错误 "Illegal document.domain value"

safari - "Open in"Safari iOS 9 中的功能无法正常工作