Printer language & sending commands

  • Thread starter Thread starter Vlki
  • Start date Start date
V

Vlki

Hello,

I can't find a way to send printer specific language codes to printer.

Part of my code :
String sString = "B50,0,0,3,1,2,50,B," + "12345678901234567890";
Font fFont = new Font("Arial", 16);
SolidBrush bBrush = new SolidBrush(Color.Black);
PointF pPoint = new PointF(150.0F, 150.0F);
ev.Graphics.DrawString(sString, fFont, bBrush, pPoint);

First part of the sString should tel my printer to print a barcode. But all
I get is the whole sString contens printed out as-it-is.
I assume the problem is that I send graphical representation of sString to
printer and not a sequence of characters.
Should I try Streams or ......?????

Printer is Eltron TLP2046 BarCode Printer

thx,
Damijan the Puzzled
 
Hi !

You need to send the data raw to the printer, otherwise Windows will eat the control codes alive.

First of all read this article:
HOW TO: Send Raw Data to a Printer by Using Visual C# .NET
http://support.microsoft.com/?kbid=322091

Copy the article code into a classfile.
Then you'll have to do something like the code below. (sorry about the formating )

(Note: The SendDocTo Printer is my addon to the article, where I have added a few methods so I could
pass a memorystream, and stream from a embedded resource file etc.
I have a lot of experience with Eltron Orion/2443 and Zebra 2443/2444 and DataMax label printers,
but almost everything I've done is done in Delphi. I've jsut started porting this stuff to C#
myself. Anyway, if you're stucked - contact me and I can see if I can help you - no garantee though
:)


<snip>
private void btnPrint2_Click(object sender, System.EventArgs e)
{
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
MemoryStream memStrm = new MemoryStream();
StreamWriter sw = new StreamWriter(memStrm);
sw.WriteLine("\x02L");
sw.WriteLine("H07");
sw.WriteLine("D11");
sw.WriteLine("19110080200002510K Ny linje");
sw.WriteLine("19110080100002510K OHM 1/4 WATT");
sw.Flush();
sw.WriteLine("1a6210000000050590PCS");
sw.WriteLine("E");
sw.WriteLine("");
sw.Flush();

memStrm.Position = 0;
LabelPrint.SendDocToPrinter(pd.PrinterSettings.PrinterName,memStrm);
sw.Close();

</snip>

<snip2>
private void btn3_Click(object sender, System.EventArgs e)
{
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
string p = pd.PrinterSettings.PrinterName;
LabelPrint.SendStringToPrinter(p,"\x02L"); // ^BL
LabelPrint.SendStringToPrinter(p,"H07");
LabelPrint.SendStringToPrinter(p,"D11");
LabelPrint.SendStringToPrinter(p,"19110080100002510K OHM 1/4 WATT");
LabelPrint.SendStringToPrinter(p,"1a6210000000050590PCS");
LabelPrint.SendStringToPrinter(p,"E");
LabelPrint.SendStringToPrinter(p,"");
}
}
</snip2>


Hello,

I can't find a way to send printer specific language codes to printer.

Part of my code :
String sString = "B50,0,0,3,1,2,50,B," + "12345678901234567890";
Font fFont = new Font("Arial", 16);
SolidBrush bBrush = new SolidBrush(Color.Black);
PointF pPoint = new PointF(150.0F, 150.0F);
ev.Graphics.DrawString(sString, fFont, bBrush, pPoint);

First part of the sString should tel my printer to print a barcode. But all
I get is the whole sString contens printed out as-it-is.
I assume the problem is that I send graphical representation of sString to
printer and not a sequence of characters.
Should I try Streams or ......?????

Printer is Eltron TLP2046 BarCode Printer

thx,
Damijan the Puzzled

Best wishes
Kai Bohli
(e-mail address removed)
Norway
 
Kai Bohli said:
Hi !

You need to send the data raw to the printer, otherwise Windows will eat the control codes alive.

First of all read this article:
HOW TO: Send Raw Data to a Printer by Using Visual C# .NET
http://support.microsoft.com/?kbid=322091

Copy the article code into a classfile.
Then you'll have to do something like the code below. (sorry about the formating )

(Note: The SendDocTo Printer is my addon to the article, where I have added a few methods so I could
pass a memorystream, and stream from a embedded resource file etc.
I have a lot of experience with Eltron Orion/2443 and Zebra 2443/2444 and DataMax label printers,
but almost everything I've done is done in Delphi. I've jsut started porting this stuff to C#
myself. Anyway, if you're stucked - contact me and I can see if I can help you - no garantee though
:)

Hi,
I'm trying to print on an Eltron TLP2247. Using the example that you
suggest, nothing appen on the printer.
How can i sent EPL command do the printer?

Thnks
EMA
 
Hi Emanuele !

Sorry for the late answer. The sample that I posted was for a Datamax printer. So in Eltron/Zebra,
it should go something like this:

char sn = '"';
MemoryStream memStrm = new MemoryStream();
StreamWriter sw = new StreamWriter(memStrm);
sw.WriteLine("\n"); // new line to start command structure
sw.WriteLine("N"); // clear image memory from last printed label
sw.WriteLine("X0,0,4,752,584"); // draw a box
sw.WriteLine("LO0,144,752,4"); // draw a line
sw.WriteLine("A40,400,1,1,1,1,N," + sn + "Made in Norway" + sn);
sw.WriteLine("B280,440,0,1,2,3,96,B," + sn + "S 000001" + sn); // write a barcode
sw.Flush();
sw.WriteLine("P1"); // print 1 label
sw.WriteLine(""); // empty line
sw.Flush();

memStrm.Position = 0;
LabelPrint.SendDocToPrinter(pd.PrinterSettings.PrinterName,memStrm);
sw.Close();

The sample above is simple, but it's all I had time to do now. Not that you should add a method to
the article file called SendDocToPrinter. I've posted the code below:
<code for the SendDocToPrinter function>
public static bool SendDocToPrinter( string szPrinterName, MemoryStream ms)
{
// Open the file.
//FileStream fs = new FileStream(szFileName, FileMode.Open);
// Create a BinaryReader on the file.
BinaryReader br = new BinaryReader(ms);
// Dim an array of bytes big enough to hold the file's contents.
Byte []bytes = new Byte[ms.Length];
bool bSuccess = false;
// Your unmanaged pointer.
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength;

nLength = Convert.ToInt32(ms.Length);
// Read the contents of the file into the array.
bytes = br.ReadBytes( nLength );
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
}
I'm trying to print on an Eltron TLP2247. Using the example that you
suggest, nothing appen on the printer.
How can i sent EPL command do the printer?

Thnks
EMA


Best wishes
Kai Bohli
(e-mail address removed)
Norway
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top