2008-12-16 38 views
11

¿Cuál es la mejor manera de imprimir cosas de C# /. Net?¿La mejor manera de imprimir desde C#/.net?

La pregunta es con respecto a las páginas individuales, así como a los informes que contienen muchas páginas.

Sería genial obtener una lista de las librerías de impresión más comunes que contienen las características principales y los errores de cada una de ellas.

[Actualización] para clientes de Windows estándar (o servidores), no para aplicaciones web, por favor.

+0

¿Cuánto ha mirado ya el espacio de nombres System.Drawing.Printing? –

+1

He buscado algunas formas de imprimir, pero antes de profundizar en una me gustaría saber más: es una gran pérdida de tiempo elegir la forma incorrecta de obtener más información. – Sam

Respuesta

9

Para informes, uso el control RDLC.

Para todo lo demás, utilizo los objetos de impresión inherentes en .NET.

Editar Los objetos de impresión inherentes se encuentran todos en el espacio de nombres System.Drawing.Printing. Cuando utiliza PrintDialog o PrintPreviewDialog en una aplicación WinForms (o WPF), es a estos objetos a los que le está dando el control.

El concepto fundamental es que está utilizando la impresora. La forma más simple de esto es:

Sub MyMethod() 
    Dim x as New PrintDocument 
    AddHandler x.PrintPage, AddressOf printDoc_PrintPage 
    x.Print 
End Sub 
Sub printDoc_PrintPage(sender as Object, e as PrintPageEventArgs) 
     Dim textToPrint as String= ".NET Printing is easy" 
     dim printFont as new Font("Courier New", 12) 
     dim leftMargin as int= e.MarginBounds.Left 
     dim topMargin as int = e.MarginBounds.Top 
     e.Graphics.DrawString(textToPrint, printFont, Brushes.Black, leftMargin, topMargin) 
End Sub 

Lo que sucede aquí es que cuando mi objeto (x) se envía el comando de impresión, se genera el evento "IMPRIMIR" (el cual está diseñado para imprimir 1 página a la vez) Este evento utiliza el atributo Graphics de PrintPageEventArgs para dibujar la cadena relevante directamente a la cola de impresión.

Here's one tutorial, y una búsqueda rápida en Google para "tutorial de impresión .NET" devuelve un poco más de 200K resultados.

+0

¿Podría ampliar un poco más los objetos de impresión inherentes? – Tigraine

+0

Sí, eso sería genial! – Sam

0

Depende mucho de los requisitos de su aplicación.

Aunque no es la herramienta perfecta (realmente lejos de eso), Crystal Reports tiende a ser una buena opción. Le da la opción de obtener datos directamente de una base de datos o, si ya tiene una lista de objetos que desea imprimir, puede pasarlos al documento y vincular las propiedades del objeto a las etiquetas del informe.

Pero dénos más información de lo que está tratando de hacer, para que pueda recibir mejores propuestas.

+0

Bueno, tengo muchas cosas de impresión que me llegan: páginas sueltas, informes largos, etiquetas adhesivas, asígneles un nombre, tendré que imprimirlo (pronto). Entonces me gustaría obtener una visión general sobre las soluciones de impresión pro y contra. – Sam

1

Utilizamos un conjunto de archivos DLL de terceros de PDFSharp que a su vez utilizan archivos DLL de MigraDoc. No estoy al tanto de todas las razones que fuimos esa dirección (la decisión fue hecha por un desarrollador senior), pero puedo decir que:

  • Parece estar en desarrollo activo.
  • Tenía la mayoría de las características de que necesitábamos.
  • El código fuente está disponible. Aunque utilizó algunos patrones y convenciones que I no había visto antes, una vez que llegué a , fue bastante fácil hacer los cambios . Agregué soporte para usar System.Drawing.Image directamente en lugar de guardar archivos.
  • Es tampoco bien documentado interna o externamente.
1

Un montón de cosas, dices. Hum, parece que deberías usar una solución con un diseñador, por lo que deberías consultar Crystal Reports y RDLC. También existe la solución de Reporting Services, pero en ese caso necesitaría un servidor con SQL Server.

Crystal Reports parece darle más opciones, pero necesita un poco más de aprendizaje que RDLC.

No recomendaría que los cree en HTML + CSS, debido a las limitaciones y el trabajo adicional que debería realizar.

1

Si puede construir su salida como FlowDocument, puede convertirla en XPS fácilmente para obtener una versión "electrónica" y la impresión del XPS.

2

»Código de ejemplo para mostrar conceptos básicos de impresión en aplicaciones de Windows Forms:

using System.Drawing.Printing; 

    PrintDocument printDoc = new PrintDocument(); 
    printDoc.DefaultPageSettings.Landscape = true; 
    printDoc.DefaultPageSettings.Margins.Left = 100; //100 = 1 inch = 2.54 cm 
    printDoc.DocumentName = "My Document Name"; //this can affect name of output PDF file if printer is a PDF printer 
    //printDoc.PrinterSettings.PrinterName = "CutePDF"; 
    printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); 

    PrintDialog printDialog = new PrintDialog(); 
    printDialog.Document = printDoc; //Document property must be set before ShowDialog() 

    DialogResult dialogResult = printDialog.ShowDialog(); 
    if (dialogResult == DialogResult.OK) 
    { 
     printDoc.Print(); //start the print 
    } 

    void printDoc_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     string textToPrint = ".NET Printing is easy"; 
     Font font = new Font("Courier New", 12); 
     // e.PageBounds is total page size (does not consider margins) 
     // e.MarginBounds is the portion of page inside margins 
     int x1 = e.MarginBounds.Left; 
     int y1 = e.MarginBounds.Top; 
     int w = e.MarginBounds.Width; 
     int h = e.MarginBounds.Height; 

     g.DrawRectangle(Pens.Red, x1, y1, w, h); //draw a rectangle around the margins of the page, also we can use: g.DrawRectangle(Pens.Red, e.MarginBounds) 
     g.DrawString(textToPrint, font, Brushes.Black, x1, y1); 

     e.HasMorePages = false; //set to true to continue printing next page 
    } 
+1

Muchas gracias, esto funciona a la perfección: D – Vladivarius

Cuestiones relacionadas