使用CPL语言的Zerba iMZ320打印机打印UIImage

时间:2014-07-22 20:55:05

标签: ios objective-c uiimage zebra-printers pcx

我尝试将UIImage转换为字节(NSData),然后将其转换为十六进制字符串但没有用。它只打印黑色条而不是图像。我想过将UIImage转换为PCX格式但无法找到好的教程。让我知道一种用斑马打印机打印UIImage的方法。

注意:仅限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 个答案:

答案 0 :(得分:0)

您可以使用Zebra的iOS SDK打印图像。它支持iMZ320。您将使用从UIImage(或特别是来自UIImage的 CGImageRef )中提取数据的相同逻辑,并通过 printImage 命令将其发送到打印机。

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

如果您不能使用SDK,则需要自己解析来自UIImage的图像数据,并使用CPCL命令 EG (或其中一个变体)进行包装。您可以在第7页第7页找到CPCL图形命令:http://www.zebra.com/content/dam/zebra/manuals/en-us/printer/cpcl-pm-en.pdf。如果你已经做了这么多,也许你可以发布你的代码,有人可以告诉你哪里出错了。

2014年7月27日更新

我现在有一些想法,你已发布一些代码。

  1. 存储图像后,请尝试使用SDK方法'printImage'。没有理由自己发送CPCL命令,因为SDK应该为您处理它。 SDK应该为您管理整个PCX与JPG的事情。注意:您应该只在打印机上存储一次图像,无需多次调用storeImage。虽然存储额外的时间不会破坏任何东西,但这是不必要的,并减慢你的日常工作!

  2. 打印机支持多种语言(ZPL,CPCL,行打印等)。如果我没记错的话,打印机可能总是接受CPCL命令但仍处于ZPL模式。不确定。无论如何,值得检查打印机认为它是什么语言。您可以询问以下查询:

    ! U1 getvar“device.languages”

    [注意在该命令后应该有换行符或回车符]