Avatar billede simsen Mester
25. oktober 2011 - 14:46 Der er 7 kommentarer og
1 løsning

Send Raw data til label printer

Hej,

Den her håber jeg godt nok, I kan hjælpe mig med. Jeg er total lost :-)

Jeg har noget "rå" data, jeg skal have sendt til en label printer (Citizen CLP621). Rigtig gættet kode til at lave en barcode :-)

Jeg anede ikke hvad, jeg skulle gribe og gøre i, men fandt så denne tutorial: http://support.microsoft.com/kb/322091

Dette har jeg så forsøgt at omsætte til noget kode:

private void button2_Click(object sender, EventArgs e)
        {
            System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();

            if (cbPrinter.SelectedIndex != -1)
            {
                string printerToUse = cbPrinter.Text;
                if (!printerToUse.Equals(""))
                    pd.PrinterSettings.PrinterName = printerToUse;

                pd.OriginAtMargins = true;
                pd.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(20, 20, 0, 20);

                if (checkBox1.Checked)
                {
                    RawPrinterHelper.SendStringToPrinter(printerToUse, "HereIsMyCodeForThePrinter");
                }
                else
                {
                    RawPrinterHelper.SendStringToPrinter(printerToUse, "LD11PGpGSGA21F1102100100010000199590101");
                }

                pd.Print();
                this.labelsprinted = 0;
            }
            else
            {
                MessageBox.Show("Vælg en label printer");
            }
        }

Nu kan jeg se, at den får fat i printeren (denne sender nemlig en blank side ud) ....men den skriver intet som helt ud - hverken mit forsøg med printer koden eller forsøget med tekst strengen "HereIsMyCodeForThePrinter".

Så det er ikke forbindelsen til printeren den er galt med. Det må være RawPrinterHelper, der ikke sender korrekt ud....Når det er en label printer. Sender jeg det ud til en laserprinter, så skriver den godt nok tekst strengen ud.

Jeg har forsøgt at skrive ud til en fil i stedet og der er der bare ingen tekst i (altså udover printer koder til label printeren), så det er ikke selve printeren, der fejler i udskriften.

Og så har jeg ikke flere ideer, hvad det så er. Håber en af jer, er i stand til at hjælpe mig :-)

mvh
simsen
Avatar billede bvli Praktikant
25. oktober 2011 - 19:27 #1
Hva' nu hvis du bare sender et byte array til den?

Hvad returerer dine kald til SendStringToPrinter?

Hvordan er printeren tilsluttet? Kunne man forestille sig, at du kunne skrive til den direkte via e.g. en alm. serial port?
Avatar billede bvli Praktikant
25. oktober 2011 - 19:33 #2
Hov? Du skal da ikke bruge et PrintDocument? Den tomme side du får ud, er nok fra dit kald til pd.Print();
Avatar billede simsen Mester
26. oktober 2011 - 09:07 #3
Hej bvli

Længere udredning: Jeg har ikke printeren fysisk tilsluttet lige nu. Det jeg har gjort, er at installere printer driveren og så udskrive til fil. Her kigger jeg så de ting, der bliver skrevet til filen. For at sikre mig, det ikke kun er udskriften til fil, den er gal med, har jeg også via fjernkontrol installeret mit program - og så forsøgt at udskrive. Og den udskriver fysisk (som i min fil) kun en blank side.....

Jeg har lavet en dropdown, der lister printerne på computeren, og vælger så den pågældende printer. Så i klik eventen på min knap (som du kan se koden for i mit første indlæg) vil jeg nu have udskrevet noget til printeren (lige nu er jeg faktisk ligeglad med barkoden.....jeg vil bare have et eller andet ud). Til dette forsøger jeg mig med RawPrinterHelper.SendStringToPrinter().

Hvis jeg ikke har pd.Print(); på kommer min knap metode ikke frem og beder mig vælge en filnavn til dokumentet. Den kører bare koden igennem og så sker der ellers intet mere. Så et eller andet sted mangler jeg noget kode, der ligesom sender min kode videre til printeren.

Jeg har i stedet forsøgt mig med nedenfor viste kode - den gør det samme.....nemlig ingenting. Altså hvis jeg ikke har pd.Print(); med, og med denne så udskriver den en blank side. Hvorfor den nye metode.....Jeg troede det måske havde noget at gøre med, at kommandoerne blev skrevet i én streng i stedet for på hver linje.

Nuværende kode:
private void button2_Click(object sender, EventArgs e)
        {
            System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();

            if (cbPrinter.SelectedIndex != -1)
            {
                string printerToUse = cbPrinter.Text;
                if (!printerToUse.Equals(""))
                    pd.PrinterSettings.PrinterName = printerToUse;

                pd.OriginAtMargins = true;
                pd.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(20, 20, 0, 20);

                if (checkBox1.Checked)
                {
                    RawPrinterHelper.SendStringToPrinter(printerToUse, "HereIsMyCodeForThePrinter");
                }
                else
                {
                    //pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pd_PrintPageTest);
                    //RawPrinterHelper.SendStringToPrinter(printerToUse, "LD11PGpGSGA21F1102100100010000199590101");
                    char sn = '"';
                    MemoryStream memStrm = new MemoryStream();
                    StreamWriter sw = new StreamWriter(memStrm);
                    sw.WriteLine("L");
                    sw.WriteLine("\n");
                    sw.WriteLine("D11");
                    sw.WriteLine("\n");
                    sw.WriteLine("PG");
                    sw.WriteLine("\n");
                    sw.WriteLine("pG");
                    sw.WriteLine("\n");
                    sw.WriteLine("SG");
                    sw.WriteLine("\n");
                    sw.WriteLine("A2");
                    sw.WriteLine("\n");
                    sw.WriteLine("1F8405005050007000199590101");
                    sw.WriteLine("\n");
                    sw.WriteLine("Q0001");
                    sw.WriteLine("\n");
                    sw.WriteLine("E");
                    sw.Flush();

                    memStrm.Position = 0;
                    RawPrinterHelper.SendDocToPrinter(printerToUse, memStrm);
                    sw.Close();

                    //pd.Print();
                    this.labelsprinted = 0;
                }
            }
            else
            {
                MessageBox.Show("Vælg en label printer");
            }
        }

Til dine spørgsmål:

1) Det samme som SendStringToPrinter
2) Den returnerer true (altså at det er gået godt)
3) Se min forklaring om tilslutningen ovenfor.
Avatar billede simsen Mester
26. oktober 2011 - 13:43 #4
Jeg bliver lidt usikker på, om den kode, jeg bruger til at konvertere min streng til bytes til brug for SendBytesToPrinter metoden, er korrekt. Nogen der gider tjekke den? Den fejler ikke - men den gør heller ikke noget. SendBytesToPrinter metoden returnerer true - altså at det er udført med succes:

string printerToUse = cbPrinter.Text;

            System.Text.Encoding enc = System.Text.Encoding.ASCII;
            byte[] myByteArray = enc.GetBytes("LD11PGpGSGA21F8405005050007000199590101Q0001E");
            //string myString = enc.GetString(myByteArray);

            // Initialize unmanged memory to hold the array.
            int size = Marshal.SizeOf(myByteArray[0]) * myByteArray.Length;

            IntPtr pnt = Marshal.AllocHGlobal(size);

            try
            {
                // Copy the array to unmanaged memory.
                Marshal.Copy(myByteArray, 0, pnt, myByteArray.Length);
            }
            finally
            {
                // Free the unmanaged memory.
                Marshal.FreeHGlobal(pnt);
            }

            //RawPrinterHelper.SendBytesToPrinter(printerToUse, pnt, size);
            RawPrinterHelper.SendBytesToPrinter(printerToUse, pnt, myByteArray.Length);

Jeg har fundet en løsning (som virker (pånær den sender en blank label ud før den udskriver barcoden) - og den sender noget ud til printeren) - men har fået at vide, den ikke er god - nogen der kan fortælle mig hvorfor:

string printerToUse = cbPrinter.Text;

            MemoryStream memStrm = new MemoryStream();
            StreamWriter sw = new StreamWriter(memStrm);
            if (!checkBox9.Checked)
            {
                sw.WriteLine("L");  //Starts label format mode
            }
            if (!checkBox2.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("D11"); //Sets pixel size
            }
            if (!checkBox3.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("PG");
            }
            if (!checkBox4.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("pG");
            }
            if (!checkBox5.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("SG");
            }
            if (!checkBox6.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("A2");
            }
            sw.WriteLine("\n");
            sw.WriteLine("1F8405005050007000199590101");
            if (!checkBox7.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("Q0001"); //Qty labels to print
            }
            if (!checkBox8.Checked)
            {
                sw.WriteLine("\n");
                sw.WriteLine("E"); //Ends label format mode and prints
            }
            sw.Flush();

            memStrm.Position = 0;
            RawPrinterHelper.SendDocToPrinter(printerToUse, memStrm);
            sw.Close();
Avatar billede simsen Mester
30. oktober 2011 - 08:47 #5
bvli

Smid et svar......Af en eller anden grund så virker stort set alle mine knapper (=metoder). Jeg har ikke rørt ved metoderne, så jeg er overbevist om, at det må være hos kunden, det har været galt.
Avatar billede simsen Mester
15. november 2011 - 15:20 #6
bvli

Er du der? - så smid venligst et svar, så jeg kan få afsluttet denne :-)
Avatar billede simsen Mester
22. november 2011 - 12:46 #7
Lukker - hvis du finder ud af, du gerne vil have points bvli - så sig til, så opretter jeg en point givning tråd :-)
Avatar billede bvli Praktikant
22. november 2011 - 12:55 #8
Hov! Jeg har ikke fået mail på, at emnet var opdateret.

Håber du fik det til at spille! Og nej, jeg har ikke været til videre gavn, så tag du point selv :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester