Распечатайте UIImage на принтере Zerba iMZ320 на языке CPCL

Я попытался преобразовать UIImage в байты (NSData), а затем преобразовал его в шестнадцатеричную строку, но безрезультатно. он печатает только черную полосу вместо изображения. Я думал о преобразовании UIImage в формат PCX, но не смог найти хорошие учебники. Дайте мне знать способ печати UIImage с принтерами Zebra.

Примечание: только язык CPCL

Опробованные ниже методы

Способ 1:

-(void)PrintImage
{
    NSData *data = UIImagePNGRepresentation(image);
    NSString* hex = [self hexRepresentationWithSpaces_AS:NO data:data];
    NSMutableString * str = [NSMutableString new];
    [str appendString:@"! 0 200 200 210 1\r\nEG 40 80 0 0\n"];
    [str appendString:hex];
    [str appendString:@"\r\nPRINT\r\n"];
    //Sending this command to Zebra Printer
}

Способ 2:

-(void)PrintImage
{
    id<ZebraPrinter,NSObject> printer = [ZebraPrinterFactory getInstance:connection error:&error];

    id<GraphicsUtil, NSObject> graphicsUtil = [printer getGraphicsUtil];
    [graphicsUtil storeImage:@"1234.jpg" withImage:[image CGIImage] withWidth:-1 andWithHeight:-1 error:&error];

    //What ever the format I send it stores in GRF file but the CPCL command accepts only .PCX file to print stored image

    NSString str = @"\n! 0 200 200 500 1 \nPCX 0 30 !<1234.PCX \nPRINT\n";
    //Sending this command to Zebra Printer
}

Другие Методы

-(NSString*)hexRepresentationWithSpaces_AS:(BOOL)spaces data:(NSData *)data
{
const unsigned char* bytes = (const unsigned char*)[data bytes];
NSUInteger nbBytes = [data length];
//If spaces is true, insert a space every this many input bytes (twice this many output characters).
static const NSUInteger spaceEveryThisManyBytes = 4UL;
//If spaces is true, insert a line-break instead of a space every this many spaces.
static const NSUInteger lineBreakEveryThisManySpaces = 4UL;
const NSUInteger lineBreakEveryThisManyBytes = spaceEveryThisManyBytes * lineBreakEveryThisManySpaces;
NSUInteger strLen = 2*nbBytes + (spaces ? nbBytes/spaceEveryThisManyBytes : 0);

NSMutableString* hex = [[NSMutableString alloc] initWithCapacity:strLen];
for(NSUInteger i=0; i<nbBytes; ) {
    [hex appendFormat:@"%02X", bytes[i]];
    //We need to increment here so that the every-n-bytes computations are right.
    ++i;

    if (spaces) {
        if (i % lineBreakEveryThisManyBytes == 0) [hex appendString:@"\n"];
        else if (i % spaceEveryThisManyBytes == 0) [hex appendString:@" "];
    }
}
return hex;
}

1 ответ

Вы можете использовать iOS SDK Zebra для печати изображений. Он поддерживает iMZ320. Вы бы использовали ту же логику для извлечения данных из UIImage (или, в частности, CGImageRef из UIImage) и отправки их на принтер с помощью команды printImage.

SDK: http://www.zebra.com/us/en/products-services/software/link-os/link-os-sdk.html

Если вы не можете использовать SDK, вам нужно будет самостоятельно проанализировать данные изображения из UIImage и обернуть его командой CPCL EG (или одним из ее вариантов). Вы можете найти графические команды CPCL в разделе 7 на странице 7 здесь: http://www.zebra.com/content/dam/zebra/manuals/en-us/printer/cpcl-pm-en.pdf. Если вы уже сделали это, возможно, вы можете опубликовать свой код, и кто-то может показать вам, где вы ошиблись.

Обновление 27 июля 2014

У меня есть пара мыслей теперь, когда вы опубликовали некоторый код.

  1. Попробуйте использовать метод SDK "printImage" после того, как вы сохранили изображение. Нет причин отправлять команду CPCL самостоятельно, поскольку SDK должен позаботиться об этом за вас. SDK должен управлять всем PCX против JPG для вас. Примечание: Вы должны хранить изображение только один раз на принтере, не нужно вызывать storeImage несколько раз. Хотя хранение дополнительных времен ничего не нарушает, это не нужно и замедляет вашу рутину!

  2. Принтер поддерживает несколько языков (ZPL, CPCL, Line print и т. Д.). Если я правильно помню, принтеры могут всегда принимать команды CPCL, но все еще в режиме ZPL. Точно сказать не могу. В любом случае, стоит проверить, на каком языке, по мнению принтера, он находится. Вы можете задать следующий запрос:

    ! U1 getvar "device.languages"

    [Обратите внимание, что после этой команды должен быть перевод строки или возврат каретки]

Другие вопросы по тегам