2008-12-16 18 views
11

Was ist der beste Weg, um Zeug aus C# /. Net zu drucken?Beste Möglichkeit zum Drucken von C#/.net?

Die Frage bezieht sich sowohl auf einzelne Seiten als auch auf Berichte mit vielen Seiten.

Es wäre toll, eine Liste der gebräuchlichsten Druckbibliotheken zu erhalten, die die Hauptmerkmale und die Fehler jeder dieser Bibliotheken enthalten.

[Update] für Standard-Windows-Clients (oder Server), nicht für Web-Anwendungen, bitte.

+0

Wie viel haben Sie bereits am System.Drawing.Printing Namespace geschaut? –

+1

Ich habe in ein paar Wegen des Druckens geschaut, aber bevor ich mich eingehender damit beschäftige, würde ich gerne mehr wissen - es ist eine große Zeitverschwendung, den falschen Weg zu wählen, mehr darüber zu erfahren. – Sam

Antwort

9

Für Berichte verwende ich die RDLC-Steuerung.

Für alles andere verwende ich die inhärenten Druckobjekte in .NET.

Bearbeiten Die inhärenten Druckobjekte befinden sich alle im System.Drawing.Printing-Namespace. Wenn Sie den PrintDialog oder den PrintPreviewDialog in einer Anwendung von WinForms (oder WPF) verwenden, ändern Sie diese Kontrolle an diesen Objekten.

Das grundlegende Konzept ist, dass Sie zum Drucker zeichnen. Die einfachste Form ist das:

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 

Was hier passiert, ist, dass, wenn mein Objekt (x) den Druckbefehl gesendet wird, das „PRINT PAGE“ Ereignis auslöst (was entworfen wird 1 Seite auf einmal drucken). Dieses Ereignis verwendet dann das Graphics-Attribut von PrintPageEventArgs, um die relevante Zeichenfolge direkt in den Druckerspooler zu zeichnen.

Here's one tutorial, und eine schnelle Google-Suche nach ".NET Drucken Tutorial" gibt ein bisschen über 200K Ergebnisse zurück.

+0

Können Sie die inhärenten Druckobjekte etwas erweitern? – Tigraine

+0

Ja, das wäre großartig !! – Sam

0

Es hängt viel von den Anforderungen Ihrer Anwendung ab.

Obwohl es nicht das perfekte Werkzeug ist (wirklich weit davon entfernt), ist Crystal Reports eher eine gute Wahl. Sie haben die Möglichkeit, Daten direkt aus einer Datenbank abzurufen. Wenn Sie bereits eine Liste von Objekten haben, die Sie drucken möchten, können Sie sie an das Dokument übergeben und die Objekteigenschaften an die Bezeichnungen des Berichts binden.

Aber geben Sie uns ein paar Informationen darüber, was Sie zu tun versuchen, damit Sie bessere Vorschläge erhalten können.

+0

Naja, ich habe jede Menge Drucksachen auf mich zu kommen: einzelne Seiten, lange Berichte, klebrige Etiketten, nenne es, ich muss es drucken (bald). Ich möchte also einen Überblick über Drucklösungen für und gegen Druck bekommen. – Sam

1

Wir verwendeten eine Reihe von Drittanbieter-DLLs von PDFSharp, die wiederum DLLs von MigraDoc verwenden. Ich bin nicht eingeweiht in alle Gründen dafür, dass wir in diese Richtung gingen (die Entscheidung von einem Senior-Entwickler gemacht wurde), aber ich kann Ihnen sagen, dass:

  • Es in aktiver Entwicklung zu sein scheint.
  • Es hatte die meisten der Features, die wir brauchten.
  • Der Quellcode ist verfügbar. Obwohl es einige Muster und Konventionen verwendet, die ich nicht vorher gesehen hatte, als ich zu sie kam, war es ziemlich einfach, die Änderungen vorzunehmen. Ich habe Unterstützung für die Verwendung von System.Drawing.Image direkt statt als Speichern von Dateien hinzugefügt.
  • Es ist nicht gut dokumentiert entweder intern oder extern.
1

Viele Sachen, sagst du. Hum, scheint, dass Sie eine Lösung mit einem Designer verwenden sollten, so sollten Sie in Crystal Reports und RDLC suchen. Es gibt auch die Reporting Services-Lösung, aber in diesem Fall benötigen Sie einen Server mit SQL Server.

Crystal Reports scheint Ihnen mehr Auswahlmöglichkeiten zu bieten, benötigt aber ein wenig mehr Lernaufwand als RDLC.

Ich würde nicht empfehlen, dass Sie diese in HTML + CSS erstellen, wegen der Einschränkungen und der zusätzlichen Arbeit, die Sie werfen müssten.

1

Wenn Sie Ihre Ausgabe als FlowDocument bauen können, können Sie es leicht in XPS drehen, um eine "elektronische" Version zu erhalten, und das XPS drucken.

2

»Beispielcode Grundlagen des Drucks in Windows zu zeigen Forms-Anwendungen:

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

Vielen Dank, das funktioniert einwandfrei: D – Vladivarius

Verwandte Themen