Slow printing with label printer could be caused by my software? - delphi

I have a software that prints labels. It generates many pages with n columns to be printed in a label printer (commonly Argox or Zebra). I use report builder to do so, meaning I send the jobs through the windows driver and not directly to the printer.
I have this one customer that is having a really hard time printing her labels. The printer pauses for 15-20 seconds between one page and another.
I´ve reviewed each and every configuration I could and did not find anything.
To make my problem worse, my customer uses the Bartender software (wich comes with Argox) and when printing there it has not this delay. Bartender uses the windows driver as well.
Well, from the point of view of my client, the problem is with my software, I don´t blame her.
From my point of view I can´t control such a thing (pause between pages) once I am using the driver.
Am I wrong? Is there anything I could do to avoid such a delay?
Important Info
Argox OS 214 TT - PPLA
Drivers updated to the last version (7.2)
Serial Cable being used

Does the report software you use create ZPL output, or a bitmap? You can check this by setting your printer driver to print to a file. If the file is huge, >1MB, it's probably creating a bitmap and that could take a long time to send to the printer.
Bartender would create ZPL if using internal fonts and barcodes, so the output will be tiny and the printer is optimized to print native ZPL. If your software uses fonts not on the printer (Arial, Times new roman, etc), it will send the label down as a graphic instead of using the printer's built in fonts, which would result in a HUGE file even for a small amount of text. Same thing goes for graphics, inlined vs. recalled graphics

Related

Using wireshark to monitor and compare packets sent to Zebra Printer?

I have a odd problem with a Zebra printer that I am using. It is supposed to print at 2 inches per second. I have set this on my control panel (it is set up as a windows printer), as well as setting it under the Zebra PrinterServer.
I use an application called CoLOS to print barcodes off of it during production, but for some reason, it keeps overwriting the 2 inches per second setting under the Zebra Net Print Server to 6 inches per second. Their tech support basically told me it's impossible on their end because it's using windows drivers, but after testing printing other items through other applications with no issue (some of which are through CoLOS itself), nothing else triggers the printer to revert to 6 inches per second except for the only print job that matters.
I have wireshark set up to monitor connections between the server and the printer. I have printed one good print from CoLOS that does not trigger the printer to change it's inches per second setting, and I did one print that I know triggers it (and verified it switched from 2 to 6 after). I have the captures that have the data packets, but I can't interpret them. Would there be a way for me to compare these/turn them into some readable format, so that I can show this to tech support?
I was able to find this which tells me how to interpret the important first few lines of the ASCII text that was sent to the printer. It confirmed for me that the production print job was sending ^PR6, setting the inches per second to 6, overwriting the 2 inches per second I had previously set to the printer.

Check usb printer status like jammed paper, ink level etc from command line for a VBScript program

I've a pc running Windows 7 Pro X64 connected to a plotter HP Designjet 800. Usually I send a lot of DWG files to the plotter and leave it alone working: plotter can take hours for finishing the job. It can happen that some issue occurs that causes a stop: jammed paper, ink finished or other kind of problem and it is very annoying discover at the end of the day that the plotter has stopped printing after few prints or worse not even one print. So in this kind of scenario I thought to realize a procedure for checking plotter status periodically and alert me if something goes wrong by email or by other way. I'd like to implement this solution in VBScript. I tried using WMI via VBScript but I'm not able to get the infos I need. Do you know if there is a way (natively or also using a third-party utility) for checking printer status via command line and getting infos like missing paper, jammed paper, ink level and so on? On HP site there is a little utility but it doesn't work via cli and it can't say if a jammed paper occurs. Thanks a lot guys for your time!

Communicate with and control a printer device via bluetooth or USB

The device is a label printer. It can be connected to via bluetooth and USB. I would imagine it is running some kind of linux, as it has a fairly complex interface/screen, but am not sure. In fact, this is something I would like to determine. But my goal is to get a shell, or some kind of 'meaningful' connection through which I can send commands/data which will trigger print events by the printer without using the manufacturer's software
Connecting to the device in ubuntu via USB creates /dev/usb/lp0. I tried connecting to this using python's serial module, but it couldn't connect to the serial port.
Via bluetooth I was also able to connect, using hcitool scan to get the device's MAC address and then rfcomm to connect (using this approach) . This created /dev/rfcomm0, which I was able to connect to and send data to using python.
Is it feasible to mimic the data normally sent over usb/bluetooth by the manufacturer's software to print without the software? I assume getting this would be possible by 'sniffing' data sent over bluetooth while a normal print command is sent by the manufacturer's software (although I suppose there's no reason it would look intelligible to a human).
If this kind of mimicry is possible, I am wondering whether simply sending the equivalent data over bluetooth, for example, would result in a print event. So far I have no reason to believe that data I send via the bluetooth connection is not being received, but I have yet to get any kind of response (data or physical) from the bluetooth connection.
Any advice/suggestions on how I might achieve my overall goal would be appreciated
This is certainly possible (sorry for the answer 6 years later, but hopefully this will help anyone later in need). I have a similar problem and this is how I solved.
I have a MHT-P80F thermo printer. I figured out in settings that it supports a protocol called TSPL. These are the instructions you need to send to a printer and tell it to do either raw text printing, or even bitmaps.
All you need to do is to construct the correct bytestream (in mostly human-readable ASCII) and send it to /dev/usb/lp0. I have not tested it via bluetooth but I assume it should be similar.
For example, if you want to print out a "Hello World", these instructions will suffice:
CLS
SIZE 80mm,50mm
GAP 5mm,0mm
HOME
TEXT 0,0,"0",0,1,1,"Hello World"
PRINT 1
Each line is separated by a "\n".
Explanations (more could be found by searching TSPL):
CLS Tell the printer to clear all previous staged commands.
SIZE Tell the printer the size of each label (width, height).
GAP Between each label there's 5mm space without paper.
HOME (Re-)locate the paper roll for a new print.
PRINT Start printing of 1 copie(s).
Note these instructions are for the use of discrete labels. For a whole paper roll it might be different. TSPL implementations on different printers may differ, so you might to experiment a bit.
Generally, if you can print a bitmap, then you can print virtually any document (e.g. using PIL in Python or Jimp in Node.js to generate an image beforehand). So here's the most useful BITMAP command:
BITMAP 16,24,40,256,0,<BYTE STREAM>
where
16: the starting (left most) X coordinate for your bitmap
24: the starting (top most) Y coordinate for your bitmap
40: the width of bitmap, in BYTES (see below)
256: the height of bitmap, in DOTS
0: mode of print, 0 being overwritting anything in that region
and <BYTESTREAM> being the binary data(black/white) of this image, from left to right and from top to bottom.
The bitmap width is given in bytes, so each byte represents 8 horizontal continous dots in the image. The highest bit 7 being most left, the lowest bit 0 most right. So if as in example we write 40 in this parameter, the image would be 40x8=320 dots in width.
The bitmap height, on the contray, is given in dots.
Most such thermal printer have a DPI of 203. This is an interesting start point to investigate into: 203/25.4 = 7.99, or rounded as 8. So for the printer, each 8 dots equals 1mm. In the above example, X=16 and Y=24 (both in dots) corresponds to starting location X=2mm and Y=3mm.
And finally, you generally do not need to inverse the color of this image. In BITMAP command, a 1 in a bit means correctly white or non-printed dot, and 0 means the black or heated dot.
I am not sure about bluetooth but for USB printing you can use the cups library (licups) and use the APIs to do the priting. It uses IPP protocol. Usually cups uses a .ppd file specific to the printer (which contains the details about the printer) for installing it. For new language versions such as PCL5, 5e, 6 etc there are generic ppd files that can be used to install any printer that uses the respective language

PCL: printing out partial page without ejecting

I want to be able to make my printer (HP DeskJet 1280 on USB) print out all raster data I have sent to it so far, without ejecting the page. I am sending only plain raster graphics and cursor positioning commands — no vector graphics, no text.
More precisely, I have two questions:
1) After sending some raster data to the printer (with Transfer Raster Data ("\033*b%dW")), how to make it print it out right away and stop, without ejecting the page?
2) After sending a vertical cursor positioning command with a positive argument (e.g., Vertical Cursor Positioning (Decipoints) ("\033&a%+dV")), how to make the printer advance the paper to the new position right away and stop there?
(Note that even solving only (1) would be almost sufficient, because advancing the cursor could be done indirectly by sending a blank raster of the appropriate height.)
Since PCL is a page description language, it could be actually impossible to do things at such a low level. But after an extensive search in the PCL documentation and the Internet, I have not yet found a definite negative answer either.
It seems that the printer has some kind of internal buffer to store its data, and that it flushes (i.e., prints out) that buffer when it grows large enough. If there were a command to tell the printer to flush that buffer immediately without doing anything else, everything would be fine. But I have not found such a command. Even "\033*rC" (End Raster Graphics) has no immediate effect.
I am using CUPS' USB backend to communicate with the printer, and have verified (using usbmon) that the backend actually sends all my commands to the printer as soon as it sees them, so it cannot be the issue of data getting stuck in the driver.
Commands that print out partial pages include, for example, "\033E" (Printer Reset), "\033%%-12345X" (Universal Exit Language), "\033&r1F" (Flush All Pages (including partial pages)) — but all of them also eject the partial page.
Can somebody suggest a clever way to do what I want, or confirm my impression that it is an absolute impossibility?

Getting printer used by default by a process

I need to print documents in a specific order.
To do that,i use shellExecute api to print documents.
Some documents may be quicker to print , so i have to wait for the document to be in the spooler before calling another shellExecute.
For that, i use FindFirstPrinterChangeNotification, waitForSingleObject and FindNextPrinterChangeNotification.
It works fine.
But if the application started by shellExecute is already open, it's possible that it prints on another printer that the windows default printer. (if default printer has been changed )
I could watch all printers, but, i'd prefer to know wich printer uses the started process and watch this printer.
With shellExecuteEx, i can get a handle to the process started by this api.
So, is there a way to know the printer used by default by a process ?
So, is there a way to know the printer used by default by a process?
No there is not. Programs are entitled to use whatever logic they choose to determine their default printer. So in general, you've no way to ask a process which printer it will use, without having more specific knowledge of the process in question.

Resources