Указан недопустимый принтер (иногда он работает, в других случаях он не будет)

#vb.net #printing

#vb.net #печать

Вопрос:

Я пытаюсь выполнить печать с выбранного сетевого принтера. Иногда он работает, но в других случаях он не будет печатать, выдавая мне следующую ошибку:

«Указан недопустимый принтер.Имя файла MYCRYSTALRPT 11124_5324_{67F07633-5EF3-49B4-9573-BB34151D75BA}.rpt»

Я нашел разные части приведенного ниже кода из сети. Я знаю, что об этом здесь спрашивали раньше, но приведенные решения для меня не работают, возможно, я просто что-то пропустил.

 Try

            Dim PrintDialog1 As New PrintDialog
            PrintDialog1.ShowDialog()
            PrintDocument1.PrinterSettings.PrinterName = PrintDialog1.PrinterSettings.PrinterName

            Dim prtdoc As New PrintDocument
            Dim strDefaultPrinter As String = PrintDialog1.PrinterSettings.PrinterName


            Dim cryRpt As New ReportDocument
            Dim crtableLogoninfos As New TableLogOnInfos
            Dim crtableLogoninfo As New TableLogOnInfo
            Dim crConnectionInfo As New ConnectionInfo
            Dim CrTables As Tables
            Dim CrTable As Table
            cryRpt.Load("C:pathofmyreportMyCrystalRPTfilename.rpt")

            With crConnectionInfo
                .ServerName = "myserver"
                .DatabaseName = "mydbase"
                .UserID = "myuser"
                .Password = "mypassword"
            End With

            CrTables = cryRpt.Database.Tables
            For Each CrTable In CrTables
                crtableLogoninfo = CrTable.LogOnInfo
                crtableLogoninfo.ConnectionInfo = crConnectionInfo
                CrTable.ApplyLogOnInfo(crtableLogoninfo)
            Next

            cryRpt.Refresh()
            cryRpt.PrintOptions.PrinterName = strDefaultPrinter
            cryRpt.PrintOptions.PaperSource = CrystalDecisions.[Shared].PaperSource.Auto
            cryRpt.PrintToPrinter(1, False, 1, 1)


        Catch ex As Exception
            MessageBox.Show(ex.InnerException.ToString())
        End Try
  

Комментарии:

1. глядя на это, я замечаю, что у вас есть PrintDocument1 , prtdoc и cryRpt что делают первые 2? Кроме того, для устранения неполадок, какое имя принтера при сбое и при успешном завершении?

2. @reckface забыл прокомментировать первые два, я этим не пользовался. При устранении неполадок я выбираю имя принтера, значение strdefaultPrinter — это имя принтера. Выглядит так: «\ network sharedprintername», прежде чем выдавать мне исключение, оно заканчивается в этой части: cryRpt.PrintOptions. Имя принтера = strDefaultPrinter

Ответ №1:

Убедитесь, что принтер, который вы собираетесь использовать, действительно существует на момент печати: попробуйте проверить с помощью этого:

 if Not PrinterSettings.InstalledPrinters.OfType(Of String)().Any(Function (s) s.Equals(strDefaultPrinter)) Then
  ' Display/handle an error
End If
  

Редактировать

Хорошо, в зависимости от используемой версии, SAP рекомендует изменить использование PrintOutputController API, указав, что PrintToPrinter он больше активно не разрабатывается и не поддерживается:

  1. Ссылка CrystalDecisions.ReportAppServer.Controllers и CrystalDecisions.ReportAppServer.ClientDoc
  2. Создайте объект параметров печати с информацией о принтере по умолчанию

     Dim options = New PrintReportOptions With
    {
        .PrinterName = strDefaultPrinter,
        .Collated = False,
        .NumberOfCopies = 1,
        .JobTitle = report.Name
    }
    ' pass the options to the print method
    report.ReportClientDocument.PrintOutputController.PrintReport(options)
    ' If you're done
    report.Close()
    report.Dispose()
      

Комментарии:

1. Привет. Я сделал это. И это показывает, что общий принтер существует. Кстати, принтер является общим сетевым принтером, если это что-то значит.

2. если он существует, он все еще терпит неудачу?

3. да, все еще сбой. Вот почему я не знаю, как отладить его сейчас, даже если он получит правильный принтер.

4. Я добавил рекомендацию SAP