Frage

Ich benutze die PrintDocument -Klasse, um in meinen Brother -Label -Drucker zu drucken. Wenn ich die Print () -Methode ausführe, beginnt der Drucker, ein rotes Fehlerlicht zu blinken, aber alles andere kehrt erfolgreich zurück.

Ich kann diesen Code auf meinem Laserdrucker ausführen und alles funktioniert gut.

Wie kann ich sehen, was den Fehler in meinem Etikettendrucker verursacht?

Code:

public class Test
{
    private Font printFont;
    private List<string> _documentLinesToPrint = new List<string>();

    public void Run()
    {
        _documentLinesToPrint.Add("Test1");
        _documentLinesToPrint.Add("Test2");
        printFont = new Font("Arial", 10);
        var pd = new PrintDocument();
        pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25);
        pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237);

        var printerSettings = new System.Drawing.Printing.PrinterSettings();
        printerSettings.PrinterName ="Brother QL-570 LE";
        pd.PrinterSettings = printerSettings;
        pd.PrinterSettings.Copies = 1;
        pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
        pd.Print();
    }

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        float linesPerPage = 0;
        float yPos = 0;
        int count = 0;
        float leftMargin = ev.MarginBounds.Left;
        float topMargin = ev.MarginBounds.Top;
        string line = null;

        // Calculate the number of lines per page.
        linesPerPage = ev.MarginBounds.Height /
           printFont.GetHeight(ev.Graphics);

        // Print each line of the file. 
        while ((count < linesPerPage) && (count < _documentLinesToPrint.Count))
        {
            line = _documentLinesToPrint[count];

            yPos = topMargin + (count *
               printFont.GetHeight(ev.Graphics));
            ev.Graphics.DrawString(line, printFont, Brushes.Black,
               leftMargin, yPos, new StringFormat());

            line = null;
            count++;
        }

        // If more lines exist, print another page. 
        if (line != null)
            ev.HasMorePages = true;
        else
            ev.HasMorePages = false;
    }
}
War es hilfreich?

Lösung

PrintDocument ist eine sehr einfache API. Sie erhalten einen einfachen generischen Druck, aber es ist auf Kosten reduzierter Funktionen, die nicht für den Drucktreiber spezifisch sind. Mein HP -Drucker gibt mir normalerweise eher einen gedruckten Fehler als eine Ausnahme. Es ist nicht verwunderlich, dass Ihnen etwas Ähnliches passiert.

Das Blinken ist wahrscheinlich ein Code, den Sie suchen können. Wenn dies fehlschlägt, können Sie versuchen, in einem Bildformat, PDF oder XPS zu speichern. Oder verwenden Sie eine Bibliothek der Drittanbieter oder schreiben Sie Ihre eigene PCL -Datei. Es gibt eine Menge Optionen. Erstellen einer Ausgabe, die Sie ansehen können, im Gegensatz zu einem im Speicher, sollte Berechnungen wie Ränder debuggen. Sie können sich ein PDF ansehen und sehen, ob es verrückt aussieht. Denken Sie einfach daran, wie er auf dem PC aussieht, möglicherweise etwas anders als die Ausgabe, insbesondere wenn Sie in der Nähe der Kanten drucken.

Andere Tipps

Ich könnte darin völlig falsch sein, aber ich verstehe, dass es beim Drucken mit diesem Code nichts mit dem Drucker selbst zu tun hat, sondern mit dem Betriebssystem. Windows richtet eine Druckwarteschlange ein, platziert die Ausgabe darin und Ihr Code kehrt zurück.

Dann nimmt Windows Elemente von der Warteschlange ab und sendet sie über den Drucker -Treiber und an Ihren Drucker. Wenn ein Fehler beim Drucken vorliegt, sollte es in der Druckwarteschlange als fehlgeschlagenes Dokument angezeigt werden. Ich denke, es ist zu spät, den Fehler als Ausnahme in dieser Phase zu fangen.

Bitte korrigieren Sie mich, wenn ich mich irre.

Ich würde Ihre Methodenkörper mit einem umgeben Block versuchen/fangen Gehen Sie dann mit den Ausnahmen innerhalb der catch jeder Methode. Als Beispiel:

public class Test
{
    private Font printFont;
    private List<string> _documentLinesToPrint = new List<string>();

    public void Run()
    {
        try
        {
            _documentLinesToPrint.Add("Test1");
            _documentLinesToPrint.Add("Test2");
            printFont = new Font("Arial", 10);
            var pd = new PrintDocument();
            pd.DefaultPageSettings.Margins = new Margins(25, 25, 25, 25);
            pd.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 237);

            var printerSettings = new System.Drawing.Printing.PrinterSettings();
            printerSettings.PrinterName = "Brother QL-570 LE";
            pd.PrinterSettings = printerSettings;
            pd.PrinterSettings.Copies = 1;
            pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
            pd.Print();
        }
        catch (InvalidPrinterException exc)
        {
            // handle your errors here.
        }

        catch (Exception ex)
        {
            // handle your errors here.
        }
    }

    // The PrintPage event is raised for each page to be printed. 
    private void pd_PrintPage(object sender, PrintPageEventArgs ev)
    {
        try
        {
            float linesPerPage = 0;
            float yPos = 0;
            int count = 0;
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            string line = null;

            // Calculate the number of lines per page.
            linesPerPage = ev.MarginBounds.Height /
               printFont.GetHeight(ev.Graphics);

            // Print each line of the file. 
            while ((count < linesPerPage) && (count < _documentLinesToPrint.Count))
            {
                line = _documentLinesToPrint[count];

                yPos = topMargin + (count *
                   printFont.GetHeight(ev.Graphics));
                ev.Graphics.DrawString(line, printFont, Brushes.Black,
                   leftMargin, yPos, new StringFormat());

                line = null;
                count++;
            }

            // If more lines exist, print another page. 
            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;
        }
        catch (InvalidPrinterException exc)
        {
            // handle your errors here.
        }

        catch (Exception ex)
        {
            // handle your errors here.
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top