“PrintTicket提供程序未能将DEVMODE转换为PrintTicket”

时间:2017-02-08 12:03:59

标签: wpf visual-studio-2012 printing

几年前我写了一个WPF(基于Visual Basic 2012)应用程序,其中包括使用标准WPF printdialogs / paginators / features“打印”一些报告.... 从那时起(2011/2015),每个人都工作得很好,我没有改变那个工作代码的一行...... 现在我不得不改变一些东西(不是打印相关的)到那个项目,当然我也检查了打印功能...... 现在“打印”代码在使用时失败...实际上不是“paginator”代码,但访问PrintTicket / Que对象失败报告 “PrintTicket提供程序无法将PrintTicket转换为DEVMODE。Win32错误:参数不正确。”

但它很奇怪,因为它并不总是失败,并且它因不同的打印机而有所不同...... 使用例如“PDF Creator”虚拟打印机,它无法写入/设置我的Que对象的某些属性而不是其他属性,而使用其他打印机失败则对其他打印机失败... 例如,PDF Creator虚拟打印机:

1)myQue.DefaultPrintTicket = myTicket = OK 2)myQue.CurrentJobSettings.Description =“some title”=使用某些打印机确定,使用不同打印机的FAILS

但是2)仅在第一次设置时失败,并且我可以通过少量时间睡眠“解决”“循环”几次......再次,第二次或第三次成功... 所以我写了一个丑陋的代码,如

Dim dlg As New PrintDialog .....

myTicket = dlg.PrintTicket
myQue = dlg.PrintQueue

“-----

'检查循环是否有趣

'属性已设置

Dim ticketIsSet(1)As Boolean

对于iLoop As Integer = 1到5

'it can fail with DEVMODE = NULL
Try
    If Not ticketIsSet(0) Then
        myQue.DefaultPrintTicket = myTicket
        ticketIsSet(0) = True
    End If

    If Not ticketIsSet(1) Then
        myQue.CurrentJobSettings.Description = Me.Title
        ticketIsSet(1) = True
    End If
Catch ex As Exception
    Errors.Add(ex.Message)
    System.Threading.Thread.CurrentThread.Sleep(1000)
End Try
If ticketIsSet(0) AndAlso ticketIsSet(1) Then Exit For

下一步

如果是Errors.Count那么

' it's still ok if title can't be set... :( 
If ticketIsSet(0) Then Errors.Clear()

结束如果

到目前为止,“非常好”,因为我完成了工作...但只是部分...因为我的Paginator习惯(成功)填充System.Windows.Controls.DocumentViewer ...这个备用documentviewer窗口以后如果要求可以打印... 再次,使用不同的打印机它成功或失败“PrintTicket提供程序无法将PrintTicket转换为DEVMODE.Win32错误:参数不正确。”异常......

使用PDF Creator虚拟打印机它成功了,使用不同的物理打印机它失败了......

我尝试了与上面相同的循环技巧,比如

Dim Errors As New Specialized.StringCollection

Dim bDone As Boolean = False

对于iLoop As Integer = 1到5

Try

    Dim writer As System.Windows.Xps.XpsDocumentWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(m_printQueue)
    writer.Write(Me.docViewer.Document.DocumentPaginator, Me.m_printTicket)
    writer = Nothing
    bDone = True

Catch ex As Exception
    Errors.Add(ex.Message)
    System.Threading.Thread.CurrentThread.Sleep(1000)
End Try

If bDone Then Exit For

接着 如果bDone Then Errors.Clear()

如果Errors.Count<> 0然后BasShowErrors(错误,我,错误)

这里它失败了(再次,在一些打印机上) writer.Write(Me.docViewer.Document.DocumentPaginator,Me.m_printTicket) “PrintTicket提供程序无法将PrintTicket转换为DEVMODE。Win32错误:参数不正确。”异常......

显然,打印机在其他程序(如World,Excel等)方面还可以,并且它与所有其他(非基于WPF的)项目一样好......而且这只是“现在”发生,因为它像初步开发时的魅力......

我当前的设置是:

Win7 Ultimate sp 1

SQL 2014 Dev Edition(不相关)

Visual Studio 2012 Ultimate Version 11.0.61219.00 Update 5

Microsoft .NET Framework版本4.6.01055

我甚至尝试使用NetFramwork修复工具(https://www.microsoft.com/en-us/download/details.aspx?id=30135)“修复”.NET Framework但没有成功......

非常感谢任何提示:)

TIA

ASQL

0 个答案:

没有答案