Problema: Tengo un reporte creado en Crystal Report con un tamaño de papel personalizado, pero al momento de imprimir, sale con otro tamaño de hoja, por más que el reporte haya sido creado correctamente.
Solución: Por código, configurar el tamaño del papel.
La mayoría de la veces, cuando se crea un reporte, con un tamaño de hoja personalizado, éste se configura correctamente al momento de diseñarlo, pero existen ocasiones, en que por más que dibujemos todo a la perfección, en el rato de la verdad, la hoja toma otro tamaño, siendo imposible imprimir.
Hay que entender que Crystal Report toma la configuración de la impresora predeterminada al momento de mostrar un reporte o imprimirlo, pero algunas veces hace falta más que tener la impresora a punto para que el reporte funcione correctamente.
Aquí se deben tener en cuenta dos cosas: Primero, tener a la mano el nombre de la impresora; ésto es importante porque ya no vamos a usar la impresora predeterminada, se tiene que utilizar un nombre fijo, por lo que si no pueden saberlo por ustedes mismos, deben crear la opción en dónde se deberá obtener de alguna manera el nombre de la impresora. Segundo, tener también a la mano el nombre del papel personalizado; ésto debe ser más sencillo de obtener, puesto que bajo ese tipo de hoja fue creado el reporte, pero si no lo tienen, deberán obtenerlo de alguna manera.
Ahora viene el código.
Voy a utiliza un procedimiento genérico, en donde configuro el reporte.
Private Sub Configurar_Hoja_CrystalReport()
'Se obtiene el informe a configurar
Dim rdInforme As New rptInforme
'Obtener nombre de impresora
Dim print_name As String = "Impresora"
'Obtener nombre de hoja personalizada
Dim print_paper As String = "HojaPersonalizada"
'Opciones del Crystal Report
Dim repOptions As CrystalDecisions.CrystalReports.Engine.PrintOptions
'Se aplican al informe
With rdInforme
'Se obtienen la opciones de impresion
repOptions = .PrintOptions
'Se setean las opciones
With repOptions
'Obtiene el id del papel --> utiliza una función especial
.PaperSize = GetPapersizeID(print_name, print_paper)
'Señala la impresora a utilizar
.PrinterName = print_name
End With
End With
End Sub
Para que funcione este procedimiento, se debe utilizar la siguiente función.
Public Function GetPapersizeID(ByVal PrinterName As String, ByVal PaperSizeName As String) As Integer
Dim pdprint As New System.Drawing.Printing.PrintDocument()
Dim PaperSizeID As Integer = 0
Dim ppname As String = ""
pdprint.PrinterSettings.PrinterName = PrinterName
For i As Integer = 0 To pdprint.PrinterSettings.PaperSizes.Count - 1
Dim rawKind As Integer
ppname = PaperSizeName
If pdprint.PrinterSettings.PaperSizes(i).PaperName = ppname Then
rawKind = CInt(pdprint.PrinterSettings.PaperSizes(i).RawKind)
PaperSizeID = rawKind
Exit For
End If
Next
Return PaperSizeID
End Function
De esta manera, el reporte funciona perfectamente.
Esta opción está probada en Visual Studio 2008 Professional