ReportViewer.PrintDialog() 打印到 Adobe PDF 时会引发异常

4

我正在开发一个WinForms应用程序,使用ReportViewer控件显示一些Reporting Services报告。在这些屏幕上,我们允许用户通过调用ReportViewer的PrintDialog()方法来打印报告,如下所示:

_reportViewer.PrintDialog();

在大多数情况下,这个功能都很好用,它会弹出标准的Windows打印对话框,用户选择要打印到哪个打印机,然后就可以打印了。但是,当用户选择使用“Adobe PDF”打印PDF时,它会抛出一个Win32Exception:指定的数据类型无效。甚至不会弹出选择保存PDF文件的对话框。
只有使用Adobe PDF打印机才会出现这种情况��我安装了NitroPDF并使用他们的PDF打印机,没有任何问题。
有人知道是什么原因导致这种情况发生吗?
编辑:
以下是堆栈跟踪信息:
at System.Drawing.Printing.StandardPrintController.OnStartPrint(PrintDocument document, PrintEventArgs e)
at System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint(PrintDocument document, PrintEventArgs e)
at System.Drawing.Printing.PrintController.Print(PrintDocument document)
at System.Drawing.Printing.PrintDocument.Print()
at Microsoft.Reporting.WinForms.ReportViewer.PrintDialog(PrinterSettings printerSettings)
at Microsoft.Reporting.WinForms.ReportViewer.PrintDialog()

如果您尝试从记事本或其他程序打印到Adobe PDF,会发生相同的情况吗? - Jim Mischel
不,我可以从记事本、Word等软件正常打印。 - JChristian
如果您可以打印到其他打印机,包括NitroPDF,我会怀疑问题出在您的Adobe Acrobat上。但是,您还说您可以从其他来源(如记事本)打印到AdobePDF...您能否尝试从更复杂的页面打印到AdobePDF?此外,您能成功将报告导出为PDF吗?您的报告是本地的还是远程的? - bitxwise
我可以成功地将此网页打印到AdobePDF。您所说的导出,是指通过报表查看器吗?通过报表查看器导出到PDF没有问题。这些报表是本地的。 - JChristian
嗯,尝试将AdobePDF打印引擎设置为默认打印机。你得到了相同的结果吗?此外,请查看http://kb2.adobe.com/cps/822/cpsid_82252.html。 - bitxwise
显示剩余2条评论
3个回答

4

这并不能真正解决问题,但可以让用户认为问题已经解决。

捕获PDF打印机抛出的错误,然后调用Reporting Services内置的导出到PDF功能。即使在Winforms中打印到PDF打印机时也不会出错。从用户的角度来看,他们像往常一样“打印到PDF”,体验是相同的。这是一个可行的解决方法。 :-)


1
据我所知,ReportViewer控件只是将每个页面呈现为位图图像。因此,当打印到PDF时,如果分辨率很高,它可能会成为一个巨大的位图。也许AdobePDF在处理大位图方面存在问题,Adobe有很多其他错误!尝试降低分辨率作为测试?
我有一个应用程序,使用ReportServer API获取页面位图,并将其分成部分以由自定义打印处理器处理。

我尝试将分辨率降低到每英寸72个点(可能的最低分辨率),但错误仍然出现。 - JChristian

1

可能是报告内容引起了这个问题。我的意思是,报告可能包含某些Adobe PDF打印机无法识别的字符。

你能否尝试打印一个非常简单/基本/空白的报告,看看是否有效。


我刚刚尝试了一下空报告,但仍然出现错误。这对于我们所有的报告也是发生的。 - JChristian
1
相关注释:我在一些用户打印到特定激光打印机时遇到了类似的问题。其他打印机没有任何问题。 - John M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接