qzind / tray

Browser plugin for sending documents and raw commands to a printer or attached device.
https://qz.io
Other
823 stars 266 forks source link

Error: Cannot parse (BASE64) into a raw IMAGE (TSPL) #1264

Open Madcheese101 opened 2 months ago

Madcheese101 commented 2 months ago

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.
Madcheese101 commented 2 months ago

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:

image

what do I need to do to convert a (PIL image object)/Image to get a command string like this?

tresf commented 2 months ago
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
tresf commented 2 months ago

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.

The TSPL BITMAP command is described here:

image image

Adding support should be trivial because we already use a similar technique for other languages.

Madcheese101 commented 2 months ago

would you mind pointing me to where that code that gets the image data to the printing code result?

tresf commented 2 months ago

Sure: https://github.com/qzind/tray/blob/2ab63ba22045b362aa6d6a6c6c8915c2201da3db/src/qz/printer/action/raw/LanguageType.java#L23

tresf commented 2 months ago

As well as here:

https://github.com/qzind/tray/blob/2ab63ba22045b362aa6d6a6c6c8915c2201da3db/src/qz/printer/action/raw/ImageWrapper.java#L340