¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Como imprimir relatórios no Crystal Reports em tamanho de papel personalizado sem diálogo de impressão.

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

Estou desenvolvendo um programa interno de visualização de relatórios em C# com Windows Forms, utilizando principalmente o CrystalReportViewer.

Meu ambiente de desenvolvimento é o Visual Studio 2012 Professional com Crystal Reports 13.0.7.

Os relatórios são criados pela equipe de gestão e depois enviados para um servidor. Todos os funcionários do escritório podem abrir os relatórios em nosso programa.
Um dos relatórios é criado com um tamanho de papel personalizado: envelope de 10" x 13".

Infelizmente, ao abri-lo no visualizador, o relatório é de alguma forma modificado para o tamanho carta - papel de 8,5" x 11". O envelope como tamanho de papel está definitivamente instalado no computador que abre o relatório. Isso não é realmente um problema para visualizar o relatório.

No entanto, gostaria de imprimir o relatório (nos envelopes e na impressora padrão) com apenas um botão, ou seja, sem uma caixa de diálogo de impressão. Tenho um formulário com um botão "Imprimir", que recebe valores de parâmetros antes de abrir o formulário do visualizador. Atualmente, preciso abrir a caixa de diálogo de impressão do Windows e fazer com que o usuário selecione o envelope personalizado para imprimir corretamente.

Tentei imprimir programaticamente usando tanto o ReportDocument.PrintToPrinter (CrystalDecisions.Engine) quanto o PrintOutputController.PrintReport (RAS).

O PrintToPrinter me informa que tenho uma combinação inválida de argumentos (Escala e DisociarTamanhoPaginaYTamanhoImpressora), ou o código é executado corretamente, mas a impressora reclama que não tem papel tamanho carta na alimentação manual (onde estão os envelopes de 10" x 13").


O PrintOutputController parece funcionar inicialmente, mas depois o relatório é impresso em papel tamanho carta.


Em ambos os casos, consigo ver que o envelope como tamanho de papel está sendo copiado da enumeração de tamanhos da impressora.


É possível imprimir com um tamanho de papel personalizado sem uma caixa de diálogo de impressão? Se sim, como posso conseguir isso?

Poderia o primeiro problema estar causando o segundo?


EDIÇÃO:
No passado, fiz uma pergunta semelhante e recebi uma resposta. Infelizmente, a solução parecia funcionar inicialmente, mas após muitos testes, cheguei ao estado descrito anteriormente.

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

4 Respuestas

0
Cargando...

Tentei o CopyTo() com o PrintToPrinter(), como no exemplo, mas sem sucesso. A impressora está solicitando papel tamanho carta (o que está incorreto) da bandeja correta. Defini ambas as opções. Meu código é essencialmente assim:

printerSettings.PrinterName = "Impressora-Escritório";

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

{

if (ps.PaperName.Equals("Envelope 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);

Estou implementando isso incorretamente? Se não, o que mais posso tentar?

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

Possivelmente, verifique o aplicativo que anexei e veja a função CopyTo(), pode funcionar para você...

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

Olá Don,

Obrigado por responder.

Se entendi corretamente, a discrepância de tamanho entre o visualizador/relatório deve ser resolvida no SP 8.
Não me importo em esperar por isso.

Terei que dedicar mais tempo ao código aqui e ver se consigo fazer com que minha impressão funcione.

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

Olá Christopher,

O SP 8 possui uma nova propriedade que deve lidar com esses tamanhos de papel personalizados. Consegui convencer a DEV de que quando são criados esses tamanhos de papel personalizados, é atribuído um valor ENUM aleatório e não há forma de obtê-lo no visualizador... Agora conseguimos acessá-lo.

Então, agora, contanto que a impressora e o tamanho do papel estejam definidos da mesma forma em todos os PCs, agora você pode obtê-lo e usá-lo em uma caixa de diálogo personalizada, mas pode não ser necessário. Não tive tempo de ver exatamente como vai funcionar, mas abaixo mostro como obtê-lo:

Procure por esta linha: rptPRT.PaperName.ToString();

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

{

// esta linha deve retornar o número de relatórios em execução simultânea

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 = "Impressora não instalada";

}

else

btnPaperSizeName.Text = "A impressora é Display";

}

catch (Exception ex)

{

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

return;

}

E verifique o aplicativo anexado. Existem métodos, um novo adicionado para RAS, que copiam as informações De e Para as informações do sistema de impressora.

Pode funcionar para você também... descompacte-o e renomeie o arquivo para *.zip.

Don

PS - O SP 8 está prestes a ser lançado, decidimos fazer um lançamento antecipado devido a alguns problemas de regressão que precisavam ser corrigidos. No entanto, não há suporte para o VS 2013... consulte o wiki de downloads para atualizações...

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?