使用打印机命令语言在 Apex3 上打印字符串
Print strings on Apex3 using printer command language
如何使用打印机命令语言或SDK在Apex3上打印字符串?
我为 android 应用程序创建了一个库,用于在移动热敏打印机上打印位图图像:
Apex3、3nStar、PR3、Bixolon、Sewoo LK P30 使用适当的 SDK。
它工作正常但速度很慢,每张 30 厘米长的票需要 20-40 秒才能打印(这取决于打印机的类型)。
对于 3nStar 和 Apex3,我开始进行改进以加快打印速度。
我为 3nStar 开发了一个 class,它打印一个 header 徽标和带有西班牙字符的格式化文本。
(一张票的不同部分有不同的对齐方式和不同的字体)
因此,票据看起来与位图图像非常相似,但打印时间仅为 6 秒。
现在我必须做同样的事情,但要使用 Apex3。在这里我被困住了。
我如何在 3nStar 上为字符串做的:
我发送 outputStream 字节,这些字节是打印机执行操作的命令。
outputStream.write(some_bytes)
第一个命令总是
{0x1b, 0x74, 40} //Esc t ( -- [ISO8859-15 (Latin9)]
打印西班牙文字符。
然后,在一个循环中,对于 n 个字符串:
我选择字体
{0x1B, 0x21, 0x00}//Esc ! 0 -- 0 is normal, 8 is bold etc.
在更改最后一个字节的地方我打印不同的字体:普通、粗体、两种高度、两种宽度和组合字体。
接下来我选择对齐方式
{0x1b, 0x61, 48} //Esc a 48 for left, 49 for center, 50 for right
然后我使用 ISO_8859_1 以字节为单位转换字符串以打印西班牙文字符并写入 outputStream。
outputStream.write(messageString.getBytes(StandardCharsets.ISO_8859_1))
要发送的最后一个字节是
{0x0a} // Move on next line
并且上述方法不适用于Apex3,而且我使用失败
http://www.old.adtech.pl/upload/Extech_Printer_Command_Language%20Rev_H_05062009.pdf
即使那本书的第 1 页上写的是适合 Apex3 的内容。
我想我错过了什么,我开始了解如何使用 Android_SDK_ESC_V1.01.17.01PRO.jar 的一些 SDK 功能来做到这一点
但我更愿意使用直接写入字节来做到这一点。
我从这里找到的答案
manual
与我为 3nStar 描述的方法的短期差异是:
1)打印前设置一个字符集
ESC F 1 //Esc t - for 3nStar
2)设置文字字体,例如
ESC K 1 3 CR //ESC F 1 - for 3nStar
3)发送一行对齐
的文本
对于 3nStar,我可以在发送文本之前使用对齐命令,例如
ESC 1 49 //Centering
但对于 Apex3,我必须知道取决于字体类型的行长,以及打印字符串的长度,
然后我得到
freeSpace = (lineLength - printingString)
并在行首设置空格(右对齐),
在最后(左对齐)或将它们分开(居中)。
因此,对于这两种类型的打印机,我使用相同的逻辑,只有 3 个地方不同。
这是简化的解释,因为真实的代码包括几个 类 和数百行代码。
如何使用打印机命令语言或SDK在Apex3上打印字符串?
我为 android 应用程序创建了一个库,用于在移动热敏打印机上打印位图图像: Apex3、3nStar、PR3、Bixolon、Sewoo LK P30 使用适当的 SDK。 它工作正常但速度很慢,每张 30 厘米长的票需要 20-40 秒才能打印(这取决于打印机的类型)。 对于 3nStar 和 Apex3,我开始进行改进以加快打印速度。
我为 3nStar 开发了一个 class,它打印一个 header 徽标和带有西班牙字符的格式化文本。 (一张票的不同部分有不同的对齐方式和不同的字体) 因此,票据看起来与位图图像非常相似,但打印时间仅为 6 秒。 现在我必须做同样的事情,但要使用 Apex3。在这里我被困住了。
我如何在 3nStar 上为字符串做的:
我发送 outputStream 字节,这些字节是打印机执行操作的命令。
outputStream.write(some_bytes)
第一个命令总是
{0x1b, 0x74, 40} //Esc t ( -- [ISO8859-15 (Latin9)]
打印西班牙文字符。
然后,在一个循环中,对于 n 个字符串:
我选择字体
{0x1B, 0x21, 0x00}//Esc ! 0 -- 0 is normal, 8 is bold etc.
在更改最后一个字节的地方我打印不同的字体:普通、粗体、两种高度、两种宽度和组合字体。
接下来我选择对齐方式
{0x1b, 0x61, 48} //Esc a 48 for left, 49 for center, 50 for right
然后我使用 ISO_8859_1 以字节为单位转换字符串以打印西班牙文字符并写入 outputStream。
outputStream.write(messageString.getBytes(StandardCharsets.ISO_8859_1))
要发送的最后一个字节是
{0x0a} // Move on next line
并且上述方法不适用于Apex3,而且我使用失败 http://www.old.adtech.pl/upload/Extech_Printer_Command_Language%20Rev_H_05062009.pdf 即使那本书的第 1 页上写的是适合 Apex3 的内容。 我想我错过了什么,我开始了解如何使用 Android_SDK_ESC_V1.01.17.01PRO.jar 的一些 SDK 功能来做到这一点 但我更愿意使用直接写入字节来做到这一点。
我从这里找到的答案 manual
与我为 3nStar 描述的方法的短期差异是:
1)打印前设置一个字符集
ESC F 1 //Esc t - for 3nStar
2)设置文字字体,例如
ESC K 1 3 CR //ESC F 1 - for 3nStar
3)发送一行对齐
的文本对于 3nStar,我可以在发送文本之前使用对齐命令,例如
ESC 1 49 //Centering
但对于 Apex3,我必须知道取决于字体类型的行长,以及打印字符串的长度, 然后我得到
freeSpace = (lineLength - printingString)
并在行首设置空格(右对齐), 在最后(左对齐)或将它们分开(居中)。
因此,对于这两种类型的打印机,我使用相同的逻辑,只有 3 个地方不同。 这是简化的解释,因为真实的代码包括几个 类 和数百行代码。