Logo
You
Code

Configurar tamaño de papel - hoja personalizada en Crystal Report

Autor YouCode - http://www.youcode.com.ar/visual-basic-net/configurar-tamano-de-papel--hoja-personalizada-en-crystal-report-237

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. 
 
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
 
http://www.youcode.com.ar/visual-basic-net/configurar-tamano-de-papel--hoja-personalizada-en-crystal-report-237