Symptom
- Crystal Reports の PrintToPrint メソッドでカスタム用紙サイズを使用すると、印刷ジョブのキューが非常に遅くなります。
Environment
- Crystal Reports 2008 V1
- Microsoft Visual Studio 2005/2008
- カスタム用紙サイズ
Reproducing the Issue
以下のコードは例であり、PrintToPrinter メソッドを呼び出す時に、印刷ジョブのキューに時間ががかります。
例:
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
Dim printername As String = cmbPrinter.Text
Dim papersize As System.Drawing.Printing.PaperSize = CType(cmbPaper.SelectedItem, System.Drawing.Printing.PaperSize)
Dim ds As New DataSet
reportDoc.Load("C:\test.RPT")
ds.ReadXml("C:\test.xml")
reportDoc.SetDataSource(ds)
' Set Printer Name
reportDoc.PrintOptions.PrinterName = printername
' Set Paper Size
reportDoc.PrintOptions.PaperSize = papersize.RawKind
Dim printerSettings As New System.Drawing.Printing.PrinterSettings
Dim pageSettings As New System.Drawing.Printing.PageSettings
reportDoc.PrintOptions.CopyTo(printerSettings, pageSettings)
printerSettings.Copies = 1
pageSettings.PaperSize = PaperSize
Dim PrintLayout As New CrystalDecisions.Shared.PrintLayoutSettings
' Set false to DissociatePageSizeAndPrinterPaperSize
reportDoc.PrintOptions.DissociatePageSizeAndPrinterPaperSize = False
PrintLayout.Scaling = PrintLayoutSettings.PrintScaling.DoNotScale
' Execute Print to printer
reportDoc.PrintToPrinter(printerSettings, pageSettings, False, PrintLayout)
End Sub
Private Sub cmbPrinter_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPrinter.SelectedIndexChanged
' Get a selected printer information
PrintDoc.PrinterSettings.PrinterName = CType(sender, ComboBox).Text
cmbPaper.Items.Clear()
' Get Paper Size information of selected printer
For Each ps As System.Drawing.Printing.PaperSize In PrintDoc.PrinterSettings.PaperSizes
cmbPaper.Items.Add(ps)
Next
cmbPaper.Text = CType(cmbPaper.Items(0), System.Drawing.Printing.PaperSize).PaperName
End Sub
Resolution
回避方法: PrintToPrinter メソッドではなく、Report Application Server (RAS) コンポーネント (PrintOutputController.PrintReport) を使用してください。
Private Sub RASPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RASPrint.Click
Dim pDoc As System.Drawing.Printing.PrintDocument
pDoc = New System.Drawing.Printing.PrintDocument
Dim rasPROpts As CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions
rasPROpts = New CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions
Dim PrintLayout As CrystalDecisions.Shared.PrintLayoutSettings
PrintLayout = New CrystalDecisions.Shared.PrintLayoutSettings
Dim rptClientDoc As CrystalDecisions.ReportAppServer.ClientDoc.ISCDReportClientDocument
Dim ds As New DataSet
reportDoc.Load("C:\test.RPT")
ds.ReadXml("C:\test.xml")
reportDoc.SetDataSource(ds)
rptClientDoc = reportDoc.ReportClientDocument
Dim papersize As System.Drawing.Printing.PaperSize = CType(cmbPaper.SelectedItem, System.Drawing.Printing.PaperSize)
Dim printername As String = cmbPrinter.Text
rasPROpts.PaperSize = papersize.RawKind
rasPROpts.PrinterName = printername
rasPROpts.JobTitle = reportDoc.FileName.ToString
rasPROpts.NumberOfCopies = 1
rptClientDoc.PrintOutputController.PrintReport(rasPROpts)
End Sub
Private Sub cmbPrinter_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPrinter.SelectedIndexChanged
' Get a selected printer information
PrintDoc.PrinterSettings.PrinterName = CType(sender, ComboBox).Text
cmbPaper.Items.Clear()
' Get Paper Size information of selected printer
For Each ps As System.Drawing.Printing.PaperSize In PrintDoc.PrinterSettings.PaperSizes
cmbPaper.Items.Add(ps)
Next
cmbPaper.Text = CType(cmbPaper.Items(0), System.Drawing.Printing.PaperSize).PaperName
End Sub
Keywords
user defined paper size, VB.NET, .NET, orientation, landscape, print job, print queue, scale, default printer, server properties, Windows application, ユーザ定義済用紙サイズ, Visual Basic .NET, 方向, 横, 印刷ジョブ, 印刷キュー, 目盛, デフォルトプリンタ, サーバプロパティ, Windows アプリケーション , KBA , BI-DEV-NET , BI Software Development Kits (SDKs) - .NET or Other , Problem