tray
tray copied to clipboard
Error: Cannot parse (BASE64) into a raw IMAGE (TSPL)
Your package is included with the frappe bench framework
, before running npm update qz-tray
it used to result in a similar error but with my website link included before the base64 string
I hope that you guide me on this matter because I am lost in this one. My Label Printer does not support the Arabic language and the only option I could think of was to make an image of that and pass it to the printer.
In this example, I am only testing passing the base64 string of an image saved in a memory object; A real use case would be sending a command that contains the barcode and its number using the TSPL commands
for it, and then under it, I would like to write text in Arabic (can only be done using the TSPL Bitmap
command)
note: English text can be passed to the printer perfectly fine using the TSPL Text
command
Python Code:
@frappe.whitelist()
def create_bitmap_from_text(text, font_size=20):
# Create an image with a white background
img = Image.new("RGB", (500, 200), color="white")
draw = ImageDraw.Draw(img)
# Load a font (you can specify a different font path)
font_path = "/usr/share/fonts/truetype/ubuntu/UbuntuMono-R.ttf"
font = ImageFont.truetype(font_path, font_size)
multiline_text = """First Line.
second line."""
draw.multiline_text((20, 20), multiline_text, fill="black", font=font, spacing=4, align="left")
temp_img = io.BytesIO()
# Save the image to the BytesIO object in PNG format
img.save(temp_img, format='PNG')
# Convert the BytesIO object's content to a byte string
image_data_bytes = temp_img.getvalue()
# Encode the image data as a Base64 string
encoded_image = base64.b64encode(image_data_bytes).decode('utf-8')
return encoded_image
JS Code
frappe.call({
method: 'renting_services.utils.utils.create_bitmap_from_text',
freeze: true,
callback: function(r) {
if (r.message){
console.log(r.message);
}
frappe.ui.form.qz_connect()
.then(function () {
var str_ = ["SIZE 76 mm, 101.6 mm\n",
"DIRECTION 0,0\n",
"REFERENCE 0,0\n",
"OFFSET 0 mm\n",
"SET PEEL OFF\n",
"SET CUTTER OFF\n",
"SET TEAR ON\n",
"CLS\n",
"BITMAP 437,743,18,40,1,",
{
type: 'raw', format: 'image', flavor: 'base64',
data: r.message,
options: { language: "tspl-ez" },
},
'\n',
'PRINT 1,1\n'
]
var config = qz.configs.create("Xprinter XP-365B");
var printData = [
{ type: 'pixel', format: 'image', flavor: 'base64', data: r.message}
];
return qz.print(config, str_);
})
.then(frappe.ui.form.qz_success)
.catch(err => {
frappe.ui.form.qz_fail(err);
console.log(err)
});
}
});
ERROR RESULT:
QZ Tray Failed: Error: Cannot parse (BASE64)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kieeeCKbze7evTtJkunTp+cObGtrS/royr370W5mddpXA6AP9fbKvZtlrE+7YHRra+u4ceMuvfTSrqdNjx03blz+xuuvvz49quv++QtVHzhwIEmSM1qV6SyxfDZwvvTBG6qnWsb6tAtGl5WVNTU1HT16tOtQeXl5kiTbtm3L37h169YkSYYOHdp1//w77OkOnVZbPVOZTCZJksOHD//tqOWzgQtcb+PezTLWp10wesaMGa2trTU1NevWrTt48GD+UEVFxS233LJ69erXXnutvb29ra1t4cKFa9asufXWWysqKrqf0rBhw26++ea1a9e+9NJLe/fuPXny5KFDh870eaUt/uSTT9KfAzqxfDZwoevlbZ2nnnqq6znff//9dHTTpk2lpaWdRj/99NN0dP/+/ZWVlZ1GKysr09HNmzd3/W2ZxsbGdLTT3e30RtDMmTPT/zc2NhYVFXU68xndcz958uTo0aNzx1577bX5oydOnMj/HpMb7X5W3b8aqbq6unT70qVLez5bgE56e+Xe/TLW3S8YXV5evmXLltdff33s2LHFxcXFxcVXXnnllClT0tEJEyasX7/+rrvuKi0tLS0tveeee9avXz9+/PiezGr8+PEbN26cMWPGwIED+/XrN2jQoOrq6tyZe6KgoODDDz+sqqrKZDJlZWWdFsi2fDZwgbNANkBAPlsGICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdICBxBwhI3AECEneAgMQdIKD/AF0hV7GlMWv9AAAAAElFTkSuQmCC
into a raw IMAGE command: UNKNOWN image conversion is not yet supported.
if this is not possible using the current version of the package, can you please guide me to the right direction?
When using the Seagull Bartender Program, it prints successfully and the print command looks like this:
SIZE 52.7 mm, 28.9 mm
DIRECTION 0,0
REFERENCE 0,0
OFFSET 0 mm
SET PEEL OFF
SET CUTTER OFF
SET TEAR ON
CLS
BITMAP 127,30,20,40,1,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïü ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃø ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÁàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðƒÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà÷ƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ?ÿÿü ?À ÿð?À ?ÿÿ ð ÿð ÿÿ ÿð ÿÿ ÿð ÿÿøÿñ€Ïÿñ€çþÿÿ þ ÿñà~ïÿñà~çþ?ÿÿÿÿøøþÿÿøøþçþ?ÿÿŸÿ€øùþÿÿøùþçþÿÿ‡ÿàøqþÿÿøqþ?ãþÿÿÆ?ÿð |cþ?ÿÿücþ?ãÿÿÿàÿø þ ÿ?ÿÿþ þáÿ ÿÿàÿÿþþÿ?ÿÿþþàÿÿÿóÿÿÿƒÿ?ÿÿÿÿ?ÿðÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿïÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿŸùÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿÿÿÿßýÿÿÿÿÿÿÿÿÿÿÿÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
BARCODE 323,200,"128M",78,0,180,3,6,"!10512345678"
CODEPAGE 1252
TEXT 269,114,"3",180,1,1,"12345678"
PRINT 1,1
the result looks like this:
what do I need to do to convert a (PIL image object)/Image to get a command string like this?
options: { language: "tspl-ez" },
TSPL-EZ isn't an image format, but rather a compatibility to allow certain printer firmwares to emulate EPL/ZPL. Please specify one of those instead.
Valid options are:
zpl
epl
cpcl
escpos
evolis
sbpl
pgl
When using the Seagull Bartender Program, it prints successfully and the print command looks like this:
BITMAP 127,30,20,40,1, ... ...
The BITMAP
command is part of the TSPL programming language. We haven't yet added support for this into QZ Tray.
- We'd accept a PR which introduces this feature
- You may -- if you wish -- prepare this data on your end
- We may be able to add support in a future version of QZ Tray
- In the meantime if you're OK using emulation through the firmware, EPL or ZPL may work with the current version of QZ Tray
The TSPL BITMAP command is described here:
Adding support should be trivial because we already use a similar technique for other languages.
would you mind pointing me to where that code that gets the image data to the printing code result?
Sure: https://github.com/qzind/tray/blob/2ab63ba22045b362aa6d6a6c6c8915c2201da3db/src/qz/printer/action/raw/LanguageType.java#L23
As well as here:
https://github.com/qzind/tray/blob/2ab63ba22045b362aa6d6a6c6c8915c2201da3db/src/qz/printer/action/raw/ImageWrapper.java#L340