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

2024-06-18

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

因此,在我再次尝试找出什么会触发什么等之前,我想知道是否有人知道关于哪些特定项目可能会触发此问题的明确信息来源?或者也许有某种方法可以连接到发生这种情况的系统,让我至少尝试弄清楚......

到目前为止,这是我在 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;
}

完整的测试应用程序可以从以下位置下载here http://helgo.net/salle/misc/WpfPrintingRasterizationTestApp.zip(VS 2010 解决方案)。

测试时我正在打印到PDF创建器 http://sourceforge.net/projects/pdfcreator/,一个虚拟 PDF 打印机,可防止大量纸张使用。但我用真实的物理打印机得到了相同的结果。然而,使用这个例子很难注意到纸上的差异,真实世界案例可能更引人注目(pic1 https://i.stack.imgur.com/JdBzb.png, pic2 https://i.stack.imgur.com/YhVHv.png).

Here is a screenshot of the result: wpf printing rasterization testapp result When you zoom in the PDF you see that the rectangles and ellipse is no longer in vector format and become blurry.


光栅化的条件

似乎很难定义。我和布豪尔有同样的经历,即不透明度和剪切似乎经常触发光栅化。我的示例确实包括这两个(在尝试触发光栅化时故意使用了这些)。并不是说任何这些都需要存在才能发生光栅化。

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

解决方法

我发现生成 XPS 文件并从微软 XPS 查看器即使使用完全相同的图形和打印机,实际上也会产生无光栅输出。

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 https://i.stack.imgur.com/f5jgv.png.

因此,您可以生成 XPS och,然后以编程方式指示,而不是直接从代码中打印微软 XPS 查看器为您打印 XPS。

这当然是一种黑客行为,而不是最佳解决方案。但如果没有找到修复或真正的解决方案(我自己还没有尝试过),如果有人有一个强制从 Microsoft XPS Viewer 进行打印的好方法,我会很感兴趣。

我还想知道即使从 Microsoft XPS Viewer 进行打印,是否有人仍然会遇到光栅化打印输出。

作为一个长远目标,我尝试在我的测试应用程序中加载 XPS 文件并打印它(code http://pastebin.com/4BDJ4dV7)。但这不起作用,仍然得到光栅化打印输出。

解决方案?

我认为这不是打印机驱动程序问题。当光栅化发生时,它会发生在所有打印机上,无一例外。我尝试过 4-5 台不同的打印机,价格从 100 美元起HP 1020到 6000 美元柯尼卡美能达 C360和一些虚拟打印机。

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

我们真的应该尝试让微软看看这个,它被归档为bug http://connect.microsoft.com/VisualStudio/feedback/details/488580/printing-complex-visuals-and-rasterization时间回到2009年,但什么也没发生。希望重现该问题的一个简洁的小代码示例会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么导致 WPF 打印机输出被光栅化? 的相关文章

  • 动态库使用静态库,出现未定义的符号

    我一直在寻找解决问题的方法 只是得到了一些线索 但我找不到任何一致的解决方案 我有一个动态库 libdyna so 的代码 它使用3个静态库 libone a libtwo a lib Three a 和log4cpp库的功能 当我第一次构
  • asm、asm 易失性内存和破坏性内存之间的区别

    在实现无锁数据结构和定时代码时 通常需要抑制编译器的优化 通常人们使用asm volatile with memory在 clobber 列表中 但有时你会看到asm volatile或者只是一个简单的asm破坏记忆 这些不同的语句对代码生
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 使用 C 序列化 double 和 float

    如何在 C 中序列化双精度数和浮点数 我有以下用于序列化短整型 整数和字符的代码 unsigned char serialize char unsigned char buffer char value buffer 0 value ret
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • 如何使用 CMake 链接多个库

    我有一些与 DCMTK 相关的代码 如果我从命令行使用 g 我可以成功构建并运行它 这是代码 include dcmtk config osconfig h include dcmtk dcmdata dctk h int main Dcm
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • gcc 的错误?模板类中友元函数的访问控制问题

    我有一个模板类 并在类中定义了一个友元函数 include
  • C++ 访问嵌套类的私有成员

    标题可能有点误导 我有以下问题 我有一棵由叶子和内部节点组成的树 用户应该能够在叶子中存储任何信息and该树有一些方法可以获取一组用户定义的值 并且需要在恒定时间内 未摊销 访问相应的叶子 我提出了以下想法 但它不起作用 因为不幸的是我无法
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • 为什么未命名的命名空间不等同于带有“using命名空间”声明的常规命名空间?

    A 最近的话题 https stackoverflow com questions 3673353 anonymous namespace ambiguityon SO 触发了这个 未命名的命名空间被认为等同于 namespace uniq
  • 以 asp-for 作为参数的自定义 ViewComponent

    我想把这个包装起来
  • llvm clang 编译器上的dynamic_cast失败

    我看到一个奇怪的失败dynamic cast正在返回NULL在 clang 编译器上 但相同的代码可以在 gcc 环境下运行 您能否指出根本原因是什么 之间可能有什么区别dynamic cast关于 llvm 和 gcc 我正在使用两个编译
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • COM Interop 挂起会冻结整个 COM 系统。如何取消COM调用

    我正在使用通过 COM Interop 包装器公开的第三方 dll 然而 其中一个 COM 调用经常冻结 至少不会返回 为了至少让我的代码更加健壮 我异步包装了调用 getDeviceInfoWaiter is a ManualResetE
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • Pythonlibs3 CMake 和 macOS

    更新2 将以下两行添加到我的 CMake 文件中时 成功找到了 python 3 及其库 这只在终端中工作的原因是因为 CLion 使用其捆绑版本的 CMake 3 6 3 而我的终端使用的更新版本 3 7 2 正确找到了 python F
  • 如何打开 Outlook 已接收和阅读电子邮件

    我们有 5 个人 使用同一封电子邮件通过 Outlook 回复客户 我想设计一个程序来打开所有已发送的电子邮件 阅读它们 打开它们 找到第一个人的签名 并在他 她的计数器中添加一个数字 以便我可以得出一些统计数据 关于如何打开 Outloo
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了

随机推荐

  • 将 SQL Server 与 Dart 结合使用

    我还没有找到很好的答案 所以我想尝试一下得到答案 将 Microsoft SQL Server 与 Dart 结合使用的最佳方式是什么 我需要它能够从基本上任何操作系统 网络和移动设备上使用它 我觉得最好的方法可能是 GraphQL 但我对
  • 一对一的DataMapper关联

    我对 DataMapper 非常陌生 我正在尝试为以下场景创建模型 我有许多用户 有用户名 密码等 他们也可以是玩家或裁判员或两者兼而有之 因此单表继承不是一个选项 基本模型是 class User include DataMapper R
  • 长变量名在 dplyr 中失败

    长度超过 39 个字符的字符串在 dplyr 中失败 返回错误 错误 索引超出范围 我错过了什么还是这是一个错误 40 个字符不起作用 library dplyr names iris 5 lt vvv 5vvv10vvv15vvv20vv
  • SwipeListView 47 度:以编程方式滑动第一项

    我想滑动第一个项目滑动列表视图 https github com 47deg android swipelistview on Activity启动以向用户显示SwipeListView是可滑动的 如何使用此 UI 元素以编程方式执行此操作
  • “neo4j-admin”不被识别为内部或外部命令、可操作程序或批处理文件

    我正在尝试将 neo4j 2 2 数据导入 neo4j 3 1 文档 https neo4j com docs operations manual current upgrade deployment upgrading 告诉我跑 neo4
  • 普罗米修斯:我如何用两个不同的指标求和

    我有两个不同的指标 具有字段类型的 metric a metric b 具有字段类型 相同 我试图总结同一类型的 a 和 b 如果类型仅存在于 metric a 上而不存在于 metric b 上 它应该返回 metric b 的结果 我在
  • 您能给我解释一下 OCaml 函子吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在函数式编程中 什么是函子 https stackoverflow com questions 2030863 in functional programming what is a functor
  • AWS API Gateway 更改资源策略中的访问被拒绝响应消息

    如何从 AWS API Gateway 资源策略错误更改默认 403 正文 Message User anonymous is not authorized to perform execute api Invoke on resource
  • C# 以下方法或属性之间的调用不明确:“System.Math.Round(double, int)”和“System.Math.Round(decimal, int)”

    由于以下错误 我的代码无法编译 以下方法或属性之间的调用不明确 System Math Round double int 和 System Math Round decimal int 我的代码是 Math Round new FileIn
  • 颜色变换器功能上的堆栈溢出错误

    我有两种颜色 红色 和 鲑鱼色 我需要动态创建面板以及面板背景颜色 这些颜色必须介于两种颜色之间 红色 public Color x y protected void Page Load object sender EventArgs e
  • 如何查找当前数据库类型

    我们有一个 SQL 脚本可以在多种类型的数据库上执行 是否可以获取正在执行 SQL 脚本的当前数据库的类型 注意 我们不能使用非标准 SQL 即 TSQL 等 不 ANSI SQL 中没有任何关于确定数据库供应商的内容
  • 减少 android studio 2.1 构建时间

    我之前使用的是 android studio 1 5 刚刚升级到 2 1 但是更新后我的构建花费了更多时间 从 15 秒到现在 2 分钟 我已经尝试过的事情如上所述 在 设置 中启用离线工作 org gradle daemon true o
  • 在 Y 轴上显示时间 - 气泡图

    我碰到Bubble Chart 最新补充 在ng2 图表 https valor software com ng2 charts 我试图根据 Y 轴的时间和 X 轴的值显示数据 我的数据就像 x 10 35 60 和 y 7 00 AM 和
  • 如何“转换”通过 Meteor.publish 返回的数据?

    流星收藏有一个转换 http docs meteor com meteor collection允许将行为附加到从 mongo 返回的对象的能力 我们希望关闭自动发布 以便客户端无法访问数据库集合 但我们仍然需要转换功能 我们使用更明确的
  • 查找嵌套列表中元素的索引?

    我有一个类似的列表 mylist lt list a 1 b list A 1 B 2 c list C 1 D 3 是否有一种 无循环 方法来识别元素的位置 例如如果我想用 5 替换 C 的值 并且在哪里找到元素 C 并不重要 我可以这样
  • 调用 OneDrive 图形 API 时出现异常

    今天 我们开始在以前正常工作的解决方案中遇到异常 如下所示 从对组 OneDrive 的 v1 端点的 Graph API 调用 GET v1 0 groups xxxxx drive root Microsoft Graph Servic
  • Laravel - 记录“找不到路线”

    当找不到路线时 我没有看到任何日志输出 我在开发模式下运行 laravel 当遇到不存在的路线时 我会看到此错误 message exception Symfony Component HttpKernel Exception NotFou
  • 如何从 asp.net MVC 4 应用程序中的 FileResult 方法返回错误消息?

    我在 asp net mvc4 中有一个 fileresult 方法 它返回 Excel 文件中的报告 现在 如果不满足我的条件 我如何从该方法返回错误消息 既然我们只能从这个方法返回一个文件 谢谢 您可以将操作方法 的签名更改为publi
  • 如何将docker postgres镜像10.3中的pg_restore升级到10.5

    我使用 tableplus 作为我的一般管理员 目前使用 10 3 版本的 docker postgres 镜像进行生产和本地主机开发 因为tableplus将他们的postgres 10驱动程序升级到了10 5 所以我不能再使用pg re
  • 是什么导致 WPF 打印机输出被光栅化?

    我在 WPF 中遇到了许多打印问题 其中正在打印的特定项目组合会突然触发打印机输出的光栅化 导致打印机输出丑陋且庞大 并可能导致打印每页需要 30 秒 我发现在控件上设置任何级别的不透明度之类的事情通常会触发此问题 我忘记了它还有什么作用