Question

J'utilise la classe PrintDocument pour imprimer sur l'imprimante de mon étiquette Brother. Lorsque j'exécute la méthode print (), l'imprimante commence à clignoter un voyant d'erreur rouge, mais tout le reste renvoie réussi.

Je peux exécuter ce même code sur mon imprimante laser et tout fonctionne bien.

Comment puis-je voir ce qui cause l'erreur sur mon imprimante d'étiquette?

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;
    }
}
Était-ce utile?

La solution

PrintDocument est une API très basique. Vous obtenez une impression générique simple, mais elle se fait au prix de la fonctionnalité réduite non spécifique au pilote d'impression. Mon imprimante HP me donne généralement une erreur imprimée plutôt qu'une exception. Ce n'est pas surprenant de voir quelque chose de similaire vous arriver.

Le clignotement est probablement un code que vous pouvez rechercher. Si cela échoue, vous pouvez essayer d'enregistrer au format d'image, PDF ou XPS. Ou utilisez une bibliothèque tierce ou écrivez le vôtre Fichier PCL. Il y a une tonne d'options. La création d'une sortie que vous pouvez afficher par opposition à une en mémoire devrait déboguer les calculs comme les marges. Vous pouvez regarder un PDF et voir s'il semble farfelu. Gardez simplement à l'esprit son apparence sur le PC peut être légèrement différent de la sortie, en particulier lors de l'impression près des bords.

Autres conseils

Je pourrais avoir complètement tort à ce sujet, mais je comprends que lorsque vous imprimez avec ce code, cela n'a rien à voir avec l'imprimante elle-même, mais avec le système d'exploitation. Windows configure une file d'attente imprimée, y place la sortie et votre code revient.

Ensuite, Windows retire les éléments de la file d'attente et les envoie via le pilote d'imprimante et vers votre imprimante. S'il y a une erreur dans l'impression, il devrait apparaître comme un document défaillant dans la file d'attente d'impression. Je pense qu'il est trop tard pour piéger l'erreur comme exception à ce stade.

S'il vous plaît, corrigez-moi si je me trompe.

J'entourerais vos corps de méthode en utilisant un Bloc d'essai / capture puis gérer l'exception (s) dans le catch de chaque méthode. Par exemple:

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.
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top