为 iOS 和 Mac 提供星式打印队列和持久化
StarPrinting 是一个基于 StarMicronics StarIO SDK 构建的 CocoaPod,用于 iOS 和 Mac OS X。它提供了一个健壮且易于使用的框架,用于将打印集成到您的应用程序中。
您的应用程序连接的每个打印机都保存一个队列,包含所有尝试打印的工作,该队列是持久的,并且只有在应用程序被杀死时才会丢失。从未完成的工作将在后台线程上重试几分钟。如果它们继续失败,它们将在队列中保持暂停状态,直到打印机重新上线。
每个打印机还有一个心跳,每几秒钟更新一次打印机状态。
可能的打印机状态如下
PrinterStatusConnected
- 在线且准备打印PrinterStatusConnecting
- 正在建立与打印机的连接PrinterStatusDisconnected
- 可用且无错误但未连接PrinterStatusLowPaper
- 几乎用完纸张PrinterStatusOutOfPaper
- 打印机中没有纸张PrinterStatusCoverOpen
- 打印机的盖子已打开PrinterStatusConnectionError
- 无法建立与打印机的连接PrinterStatusLostConnectionError
- 丢失与打印机的连接(可能由于关闭电源或断开网络连接所致)PrinterStatusPrintError
- 向打印机发送了无效的打印数据PrinterStatusIncompatible
- 打印机与当前版本 StarPrinting 不兼容PrinterStatusUnkownError
- 遇到未知错误您可以将 StarPrinting 安装得像其他任何 CocoaPod 一样。有关安装和使用 CocoaPods 的说明,请参阅 cocoapods.org。
pod "StarPrinting", "~> 0.1"
以下导入语句是您唯一需要的。它将导入从包导入的所有必要的头文件。
#import <StarPrinting/StarPrinting.h>
初始化打印机的最佳方式是调用类方法 [Printer search:(PrinterSearchBlock)block]
,它返回一个打印机对象数组。一旦连接到打印机,只需调用类方法 [Printer connectedPrinter]
即可。
要搜索可用的打印机,使用类搜索方法,并传入一个结果块。
[Printer search:^(NSArray *listOfPrinters) {
// do something with the list of printers
}];
StarPrinting 还提供了一个打印机代理协议,以便应用程序可以监听状态变化。每个打印机代理必须实现以下方法:
@interface MyClass : NSObject <PrinterDelegate>
- (void)printer:(Printer *)printer didChangeStatus:(PrinterStatus)status
{
// update UI based on new printer status
}
StarPrinting 使用 XML 文件来存储打印数据。调用任何打印方法时,它会解析 XML,将数据编码为打印机友好的格式,最后发送到打印机打印。示例 XML 文件可以在 StarPrintingExample/samples 文件夹中找到。您可以在这里找到可接受 XML 标签的列表 here。
要向打印机发送数据,您必须创建一个 PrintData
对象。 PrintData
是一个包装对象,它有两个属性
NSString
filePathNSDictionary
dictionary文件路径告诉打印机 XML 文件的位置,字典存储要动态消费到 XML 文件中的变量数据。
要打印测试页,只需在打印机上调用 printTest
方法。这是打印机为您创建 PrintData
包装对象的示例。测试页 xml 文件包含在 samples 文件夹中。
[[Printer connectedPrinter] printTest];
要打印 XML 文件,您需要创建一个 PrintData
对象并将其传递给打印方法。对于静态 XML 文件,只需将字典传递 nil
。
NSString *filePath = [NSBundle mainBundle] pathForResource:@"static_receipt" ofType:@"xml"];
PrintData *printData = [[PrintData alloc] initWithDictionary:nil atFilePath:filePath];
[[Printer connectedPrinter] print:printData];
对于动态 XML 文件,您需要包含一个包含您想要传递的每个变量的字典。
NSString *filePath = [NSBundle mainBundle] pathForResource:@"dynamic_receipt" ofType:@"xml"];
NSDictionary *dictionary = @{
@"{{day}}" : self.day,
@"{{month}}" : self.month,
@"{{year}}" : self.year
};
PrintData *printData = [[PrintData alloc] initWithDictionary:dictionary atFilePath:filePath];
[[Printer connectedPrinter] print:printData];
在 XML 文件中,变量使用双大括号语法创建:{{var}}
。
以下是一个需要日期、月份和年份变量的示例 XML 文件
<print>
<text><bold>The current day is: </bold></text>
<text>{{month}}-{{day}}-{{year}}</text>
</print>
StarPrinting 提供的最强大的工具之一是能够从任何 Objective-C 类遵守 Printable
协议。所有遵守 Printable
的类都必须实现 printedFormat
方法。该方法简单返回一个 PrintData
对象。当在可打印类的实例上调用 print
时,它将自动调用 printedFormat
并将数据发送到打印机。
遵守协议
@interface MyDateClass : NSObject <Printable>
实现方法
- (PrintData *)printedFormat
{
NSString *filePath = [NSBundle mainBundle] pathForResource:@"dynamic_receipt" ofType:@"xml"];
NSDictionary *dictionary = @{
@"{{day}}" : self.day,
@"{{month}}" : self.month,
@"{{year}}" : self.year
};
return [[PrintData alloc] initWithDictionary:dictionary atFilePath:filePath];
}
在对象上调用打印
[myDateObject print];
[myDateObject print:printer];
以下都是在 XML 文件中包含的可接受标签。每一个都有长名和简称。
<text>
<t>
- 任何可打印文本(所有其他格式化标签都必须嵌套在其中一个中)<bold>
<b>
- 粗体文本<underline>
<ul>
- 下划线文本<upperline>
<upl>
- 上部线文本<large>
<lg>
- 大文字<invertcolor>
<ic>
- 反转颜色<center>
<c>
- 居中对齐<left>
<l>
- 左对齐<right>
<r>
- 右对齐<barcode />
<bc />
- 条形码<tab />
<tb />
- 制表符<dashednewline />
<dl />
- 虚线换行<newline />
<nl />
- 换行包含一个示例应用,展示如何连接打印机,根据打印机状态显示错误消息以及如何打印自定义数据。
StarPrinting是由Matt Newberry和Will Loderhose创建的。
StarPrinting遵循MIT许可证。请参阅LICENSE文件以获取更多信息。