c # - Værktøjer til udskrivning fra en Windows-formular

Indlæg af Hanne Mølgaard Plasc

Problem



Så jeg skal udskrive til en laserprinter fra en Windows-applikation (c #, .net 4), og jeg har opdaget den super 'interessante' PrintDocument-klasse og har nu en kode, der virker, men det ser sådan ud:


private void PrintCollate(vws.custom.production.IndiPackLabel ipl)
    {
        var pd = new PrintDocument();
        pd.DocumentName = "Collate";
        var printerSettings = new System.Drawing.Printing.PrinterSettings();
        printerSettings.PrinterName = "HP LaserJet 4100";
        pd.PrinterSettings = printerSettings;
        pd.PrinterSettings.Copies = 1;
        \_currCollate = ipl;
        pd.PrintPage += new PrintPageEventHandler(pd\_PrintPage);
        pd.Print();
        \_currCollate = null;
    }

    private static vws.custom.production.IndiPackLabel \_currCollate;

    public void pd\_PrintPage(Object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        float linesPerPage = 0;

        //int count = 0;
        float leftMargin = 20;
        float topMargin = 20;

        float yPos = topMargin;


        var printFontNormal = new System.Drawing.Font("consolas", 10);
        var printFontNormalBold = new System.Drawing.Font("consolas", 10, FontStyle.Bold);
        float stdFontHeight = printFontNormal.GetHeight(e.Graphics);

        var printFontSmall = new System.Drawing.Font("consolas", 8);
        float smallFontHeight = printFontSmall.GetHeight(e.Graphics);

        linesPerPage = e.MarginBounds.Height / stdFontHeight;

        e.Graphics.DrawString(("Order: " + \_currCollate.OrderDescription).PadRight(91) + "ORD #:" + \_currCollate.OrderNumber, printFontNormal, Brushes.Black, leftMargin, yPos);
        yPos += stdFontHeight;

        string customerInfo =  (\_currCollate.Customer.FirstName + " " + \_currCollate.Customer.LastName).PadRight(90) + " BAG #" + \_currCollate.BagNumber;
        e.Graphics.DrawString(customerInfo, printFontNormal, Brushes.Black, leftMargin, yPos);
        yPos += stdFontHeight;
        yPos += stdFontHeight;

        string header = "ITEMNO".PadRight(20) + "ITEM NAME".PadRight(70) + "QTY".PadRight(3);
        e.Graphics.DrawString(header, printFontNormalBold, Brushes.Black, leftMargin, yPos);

        int itemTotal = 0;

        foreach (var item in \_currCollate.OrderItems)
        {
            yPos += stdFontHeight;
            string itemLine = item.ItemNo.PadRight(20) + (item.ItemName + " " + item.OptionNames).PadRight(70) + item.Qty.ToString().PadRight(3);
            e.Graphics.DrawString(itemLine, printFontNormal, Brushes.Black, leftMargin, yPos);

            if (item.Notes.Length > 0)
            {
                yPos += stdFontHeight;
                string notesLine = string.Empty.PadRight(20) + item.Notes;
                e.Graphics.DrawString(notesLine, printFontNormal, Brushes.Black, leftMargin, yPos);
            }

            itemTotal += item.Qty;
        }

        yPos += stdFontHeight;
        string footer = "TOTAL ITEMS: ".PadRight(90) + itemTotal;
        e.Graphics.DrawString(footer, printFontNormal, Brushes.Black, leftMargin, yPos);

        e.Graphics.DrawRectangle(new Pen(Color.Black, 2), new Rectangle(20,600,700,500));
    }


Der skal være en bedre måde. Især når jeg skal ændre dette om 6 måneder og skal genfinde det her.


Jeg bruger den neodynamiske termiske etiket SDK (http://www.neodynamic.com/ND/ProductsPage.aspx?tabid=107u0026amp;prod=thermallabel) til udskrivning til Zebra-printere og håber på et lignende API til oprettelse af en print dokument til en laserprinter. Jeg skal også tilføje stregkodeudskrivning til dette udskriftsdokument, så alle værktøjer, der indeholder stregkodefunktionalitet, vil være endnu mere nyttige.


Nogen forslag?

Bedste reference


Hvis du har brug for din Windows-formular trykt exacly som vist på skærmen, vil jeg foreslå at bruge DrawToBitmap-metoden. Flere detaljer: Sådan får du et skærmbillede af en .Net-kontrol programmatisk. Denne fremgangsmåde virker også med sammensatte kontroller (fx hele formularen). [2]


Hvis du har brug for mere avancerede udskrivningsfunktioner, vil jeg foreslå at lede efter noget 'rapporteringsbibliotek' til .NET (muligvis en af ​​disse: Report Viewer/Crystal Reports/SQL Server Reporting Services). Kan ikke give nogen detaljeret vejledning om dette dog, da jeg ikke har brugt nogen af ​​dem selv endnu. [4]