Skip to content

Commit bc0b520

Browse files
authored
Merge pull request #24 from tillhub/develop
Verifone image printing improvements
2 parents ffe6dc1 + 4ce2419 commit bc0b520

File tree

6 files changed

+106
-154
lines changed

6 files changed

+106
-154
lines changed

print-engine/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ afterEvaluate {
8484
create<MavenPublication>("print-engine") {
8585
groupId = "de.tillhub.printengine"
8686
artifactId = "print-engine"
87-
version = "1.7.0"
87+
version = "1.7.1"
8888

8989
from(components.getByName("release"))
9090
}

print-engine/src/main/java/de/tillhub/printengine/data/PrinterInfo.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ data class PrinterInfo(
2020
enum class PrintingPaperSpec(val characterCount: Int) {
2121
/** Printing paper width of 56 mm */
2222
PAX_PAPER_56MM(32),
23-
SUNMI_PAPER_56MM(38)
23+
SUNMI_PAPER_56MM(38),
24+
VERIFONE_PAPER_58MM(32)
2425
}
2526

2627
/**

print-engine/src/main/java/de/tillhub/printengine/verifone/VerifonePrintController.kt

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import de.tillhub.printengine.data.PrintingPaperSpec
1313
import de.tillhub.printengine.data.RawPrinterData
1414
import de.tillhub.printengine.barcode.BarcodeEncoder
1515
import de.tillhub.printengine.barcode.BarcodeType
16+
import de.tillhub.printengine.verifone.VerifoneUtils.FEED_PAPER
17+
import de.tillhub.printengine.verifone.VerifoneUtils.generateImageHtml
18+
import de.tillhub.printengine.verifone.VerifoneUtils.monospaceText
1619
import de.tillhub.printengine.verifone.VerifoneUtils.singleLineCenteredText
1720
import de.tillhub.printengine.verifone.VerifoneUtils.transformToHtml
1821
import kotlinx.coroutines.flow.MutableStateFlow
@@ -26,7 +29,7 @@ class VerifonePrintController(
2629
* If this field is set to false each print command is handled separately.
2730
* If it is set to true the print commands are grouped and handled when start() is called
2831
*/
29-
private val batchPrint: Boolean = true
32+
private val batchPrint: Boolean = BATCH_PRINT_DEFAULT
3033
) : PrinterController {
3134

3235
private val batchSB = StringBuilder()
@@ -67,17 +70,15 @@ class VerifonePrintController(
6770

6871
override fun observePrinterState(): StateFlow<PrinterState> = printerState
6972

70-
override fun setFontSize(fontSize: PrintingFontType) {
71-
// Not supported
72-
}
73+
override fun setFontSize(fontSize: PrintingFontType) = Unit // Not supported
7374

7475
override fun printText(text: String) {
7576
if (batchPrint) {
76-
batchSB.append(text).append("\n")
77+
batchSB.appendLine(monospaceText(text))
7778
} else {
7879
printManager.printString(
7980
printListener,
80-
transformToHtml(text),
81+
transformToHtml(monospaceText(text)),
8182
Printer.PRINTER_NO_CUTTER_LINE_FEED
8283
)
8384
}
@@ -98,16 +99,16 @@ class VerifonePrintController(
9899
}
99100

100101
override fun printImage(image: Bitmap) {
101-
if (batchPrint && batchSB.isNotEmpty()) {
102-
printBatchedString()
102+
if (batchPrint) {
103+
batchSB.append(generateImageHtml(image))
104+
} else {
105+
printManager.printBitmap(printListener, image, Printer.PRINTER_NO_CUTTER_LINE_FEED)
103106
}
104-
105-
printManager.printBitmap(printListener, image, Printer.PRINTER_NO_CUTTER_LINE_FEED)
106107
}
107108

108109
override fun feedPaper() {
109110
if (batchPrint) {
110-
batchSB.append("\n\n\n")
111+
batchSB.append(FEED_PAPER)
111112
} else {
112113
printManager.printString(printListener, "", Printer.PRINTER_NO_CUT)
113114
}
@@ -121,20 +122,17 @@ class VerifonePrintController(
121122
}
122123
}
123124

124-
override fun setIntensity(intensity: PrintingIntensity) {
125-
// Not supported
126-
}
125+
override fun setIntensity(intensity: PrintingIntensity) = Unit // Not supported
127126

128127
override fun start() {
129-
if (batchPrint) {
130-
if (batchSB.isNotEmpty()) {
131-
printBatchedString()
132-
}
133-
134-
if (useCutter) {
135-
printManager.printString(printListener, "", Printer.PRINTER_FULL_CUT)
136-
}
128+
if (batchPrint && batchSB.isNotEmpty()) {
129+
printManager.printString(
130+
printListener,
131+
transformToHtml(batchSB.toString()),
132+
if (useCutter) Printer.PRINTER_FULL_CUT else Printer.PRINTER_NO_CUTTER_LINE_FEED
133+
)
137134

135+
batchSB.clear()
138136
useCutter = false
139137
}
140138
}
@@ -144,25 +142,15 @@ class VerifonePrintController(
144142
serialNumber = "n/a",
145143
deviceModel = "Verifone T630c",
146144
printerVersion = "n/a",
147-
printerPaperSpec = PrintingPaperSpec.PAX_PAPER_56MM,
145+
printerPaperSpec = PrintingPaperSpec.VERIFONE_PAPER_58MM,
148146
printingFontType = PrintingFontType.DEFAULT_FONT_SIZE,
149147
printerHead = "n/a",
150148
printedDistance = 0,
151149
serviceVersion = PrinterServiceVersion.Unknown
152150
)
153151

154-
private fun printBatchedString() {
155-
val payload = batchSB.toString()
156-
157-
printManager.printString(
158-
printListener,
159-
transformToHtml(payload),
160-
Printer.PRINTER_NO_CUTTER_LINE_FEED
161-
)
162-
batchSB.clear()
163-
}
164-
165152
companion object {
153+
private const val BATCH_PRINT_DEFAULT = true
166154
private const val BARCODE_HEIGHT = 140
167155
private const val BARCODE_WIDTH = 420
168156
private const val QR_CODE_SIZE = 420

print-engine/src/main/java/de/tillhub/printengine/verifone/VerifoneUtils.kt

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,32 @@ package de.tillhub.printengine.verifone
22

33
import android.graphics.Bitmap
44
import android.util.Base64
5+
import androidx.annotation.VisibleForTesting
56
import java.io.ByteArrayOutputStream
67

78
object VerifoneUtils {
89

910
fun transformToHtml(text: String): String =
10-
"<html>" +
11-
"<body>" +
12-
"""<pre style="font-family: monospace; letter-spacing: 0px; font-size: 20px;">""" + "\n" +
13-
text +
14-
"\n</pre>" +
15-
"</body>" +
16-
"</html>"
11+
"<html><body>$text</body></html>"
12+
13+
fun monospaceText(text: String): String =
14+
"<pre style=\"font-family: monospace; letter-spacing: 0px; font-size: 20px;\">$text</pre>"
1715

1816
fun singleLineCenteredText(text: String): String =
19-
"<table style='width:100%' border=\"0\">" +
20-
"<tr><td style=\"text-align: center;\">$text</td></tr>" +
21-
"</table>"
17+
"<div style=\"text-align:center;\">$text</div>"
2218

23-
fun transformToHtml(image: Bitmap): String =
24-
"<tr><td style=\"text-align: center;\">" +
25-
"<img src=\"data:image/png;base64, ${ encodeImage(image) }\" alt=\"Red dot\" />" +
26-
"</td></tr>"
19+
fun generateImageHtml(image: Bitmap): String =
20+
"<div style=\"text-align:center;\">" +
21+
"<img src=\"data:image/png;base64,${encodeToBase64(image)}\"/>" +
22+
"</div>"
2723

28-
private fun encodeImage(image: Bitmap): String = ByteArrayOutputStream().let { stream ->
29-
image.compress(Bitmap.CompressFormat.JPEG, JPEG_QUALITY, stream)
24+
@VisibleForTesting
25+
fun encodeToBase64(image: Bitmap): String = ByteArrayOutputStream().let { stream ->
26+
image.compress(Bitmap.CompressFormat.PNG, PNG_QUALITY, stream)
3027
val b = stream.toByteArray()
3128
Base64.encodeToString(b, Base64.DEFAULT)
3229
}
3330

34-
private const val JPEG_QUALITY = 100
31+
const val FEED_PAPER: String = "<br /><br /><br /><br /><br />"
32+
private const val PNG_QUALITY = 100
3533
}

0 commit comments

Comments
 (0)