Avalados por :

Cómo imprimir informes en Crystal Reports en tamaño de papel personalizado sin diálogo de impresión

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 101 Vistas
0
Cargando...

Estoy desarrollando un programa interno de visualización de informes en C# con Windows Forms, utilizando principalmente CrystalReportViewer.

Mi entorno de desarrollo es Visual Studio 2012 Professional con Crystal Reports 13.0.7.

Los informes son creados por el personal de gestión, luego se suben a un servidor. Todos los empleados de la oficina pueden abrir los informes en nuestro programa.
Uno de los informes se crea con un tamaño de papel personalizado: sobre de 10" x 13".

Desafortunadamente, al abrirlo en el visor, el informe se modifica de alguna manera para estar en tamaño carta - papel de 8.5" x 11". El sobre como tamaño de papel está definitivamente instalado en la computadora que abre el informe. Esto no es realmente un problema para ver el informe.

Sin embargo, me gustaría imprimir el informe (en los sobres y en la impresora predeterminada) con solo un botón, es decir, sin un cuadro de diálogo de impresión. Tengo un formulario con un botón "Imprimir", que toma valores de parámetros antes de que se abra el formulario del visor. Por ahora, tengo que abrir el cuadro de diálogo de impresión de Windows y hacer que el usuario seleccione el sobre personalizado para imprimir correctamente.

He intentado imprimir programáticamente utilizando tanto ReportDocument.PrintToPrinter (CrystalDecisions.Engine) como PrintOutputController.PrintReport (RAS).

PrintToPrinter me dice que tengo una combinación inválida de argumentos (Escala y DisociarTamañoPáginaYTamañoImpresora), o bien el código se ejecuta correctamente pero la impresora se queja de que no tiene papel de tamaño carta en la alimentación manual (donde están los sobres de 10" x 13").


PrintOutputController parece funcionar al principio, pero luego el informe se imprime en papel tamaño carta.


En ambos casos, puedo ver que el sobre como tamaño de papel se está copiando de la enumeración de tamaños de la impresora.


¿Es posible imprimir con un tamaño de papel personalizado sin un cuadro de diálogo de impresión? En caso afirmativo, ¿cómo puedo lograrlo?

¿Podría ser que el primer problema esté causando el segundo?


EDIT:
En el pasado había hecho una pregunta similar y recibí una respuesta. Desafortunadamente, la solución parecía funcionar inicialmente, pero después de muchas pruebas he llegado al estado descrito anteriormente.

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Probé CopyTo() con PrintToPrinter(), como en el ejemplo, pero sin éxito. La impresora me pide papel de tamaño carta (lo cual es incorrecto) desde la bandeja correcta. Establecí ambas opciones. Mi código es esencialmente así:

printerSettings.PrinterName = "Impresora-Oficina";

foreach (System.Drawing.Printing.PaperSize ps in printerSettings.PaperSizes)

{

if (ps.PaperName.Equals("Sobre Personalizado"))

{

rptDoc.PrintOptions.PaperSize = (PaperSize)ps.RawKind;

break;

}

}

rptDoc.PrintOptions.PaperSource = PaperSource.Manual;

rptDoc.PrintOptions.PrinterDuplex = PrinterDuplex.Default;

rptDoc.PrintOptions.DissociatePageSizeAndPrinterPaperSize = true;

rptDoc.PrintOptions.CopyTo(printerSettings, pageSettings);

rptDoc.PrintToPrinter(printerSettings, pageSettings, false, printLayout);

¿Estoy implementando esto incorrectamente? Si no, ¿qué más puedo intentar?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Posiblemente, revisa la aplicación que adjunté y mira la función CopyTo(), podría funcionar para ti...

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Don,

Gracias por responder.

Si te entiendo correctamente, la discrepancia de tamaño entre el visor/informe debería solucionarse en SP 8.
No me importa esperar por eso.

Tendré que dedicar más tiempo al código aquí y ver si puedo hacer que mi impresión funcione.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Christopher,

SP 8 tiene una nueva propiedad que debería manejar estos tamaños de papel personalizados. Logré convencer a DEV de que cuando se crean estos tamaños de papel personalizados se asigna un valor ENUM aleatorio y no hay forma de obtenerlo en el visor... Ahora podemos acceder a él.

Así que ahora, siempre y cuando la impresora y el tamaño de papel estén definidos en la PC de todos de la misma manera, ahora puedes obtenerlo y usarlo en un cuadro de diálogo personalizado, pero puede que no sea necesario. No he tenido tiempo de ver exactamente cómo va a funcionar, pero a continuación te muestro cómo obtenerlo:

Busca esta línea: rptPRT.PaperName.ToString();

private void getPrinterInfoOnOpen(CrystalDecisions.CrystalReports.Engine.ReportDocument rpt)

{

// esta línea debería devolver el número de informes concurrentes que se están ejecutando

int i = CrystalDecisions.CrystalReports.Engine.ReportDocument.GetConcurrentUsage();

rptClientDoc = rpt.ReportClientDocument;

CrystalDecisions.Shared.PrintLayoutSettings PrintLayout = new CrystalDecisions.Shared.PrintLayoutSettings();

CrystalDecisions.ReportAppServer.ReportDefModel.PrintOptions rptPRT = new CrystalDecisions.ReportAppServer.ReportDefModel.PrintOptions();

CrystalDecisions.ReportAppServer.ReportDefModel.PrintOptions rptPRTCloned = new CrystalDecisions.ReportAppServer.ReportDefModel.PrintOptions();

PrinterSettings ps = new PrinterSettings();

PageSettings pgs = new PageSettings();

rptPRT = rptClientDoc.PrintOutputController.GetPrintOptions();

rptPRTCloned = rptPRT.Clone();

PrintLayout.Scaling = PrintLayoutSettings.PrintScaling.DoNotScale;

if (rpt.PrintOptions.SavedPrinterName.Length != 0)

{

btnSavedPrinterName.Text = rpt.PrintOptions.SavedPrinterName.ToString();

}

else

btnSavedPrinterName.Text = rptPRT.SavedPrinterName.ToString();

//SP 8

try{

if (rptPRT.DriverName != "DISPLAY")

{

btnPaperSizeName.Text = rptPRT.PaperName.ToString();

if (rptPRT.PaperName.ToString() == "")

{

btnPaperSizeName.Text = "Impresora no instalada";

}

}

else

btnPaperSizeName.Text = "La impresora es Display";

}

catch (Exception ex)

{

btnSQLStatement.Text = "ERROR: " + ex.Message;

return;

}

Y revisa la aplicación adjunta. Hay métodos, uno nuevo añadido para RAS, que copian la información Desde y Hacia la información del sistema de impresora.

Puede que también funcione para ti.... descomprímelo y luego renombra el archivo a *.zip.

Don

PS - SP 8 está cerca de ser lanzado, decidimos hacer un lanzamiento anticipado debido a algunos problemas de regresión que tuvieron que ser corregidos. Sin embargo, no hay soporte para VS 2013... consulta el wiki de descargas para actualizaciones...

pastedImage_0.png
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?