我尝试将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;
}
答案 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。如果你已经做了这么多,也许你可以发布你的代码,有人可以告诉你哪里出错了。
我现在有一些想法,你已发布一些代码。
存储图像后,请尝试使用SDK方法'printImage'。没有理由自己发送CPCL命令,因为SDK应该为您处理它。 SDK应该为您管理整个PCX与JPG的事情。注意:您应该只在打印机上存储一次图像,无需多次调用storeImage。虽然存储额外的时间不会破坏任何东西,但这是不必要的,并减慢你的日常工作!
打印机支持多种语言(ZPL,CPCL,行打印等)。如果我没记错的话,打印机可能总是接受CPCL命令但仍处于ZPL模式。不确定。无论如何,值得检查打印机认为它是什么语言。您可以询问以下查询:
! U1 getvar“device.languages”
[注意在该命令后应该有换行符或回车符]