33import com .github .anastaciocintra .escpos .EscPos ;
44import com .github .anastaciocintra .escpos .EscPosConst ;
55import com .github .anastaciocintra .escpos .Style ;
6+ import com .github .anastaciocintra .escpos .image .BitonalThreshold ;
7+ import com .github .anastaciocintra .escpos .image .CoffeeImageImpl ;
8+ import com .github .anastaciocintra .escpos .image .EscPosImage ;
9+ import com .github .anastaciocintra .escpos .image .GraphicsImageWrapper ;
610import com .github .anastaciocintra .output .PrinterOutputStream ;
11+ import com .google .zxing .BarcodeFormat ;
12+ import com .google .zxing .WriterException ;
13+ import com .google .zxing .client .j2se .MatrixToImageWriter ;
14+ import com .google .zxing .common .BitMatrix ;
15+ import com .google .zxing .qrcode .QRCodeWriter ;
716import com .mateo .freetpv .model .DatosTicket ;
817import com .mateo .freetpv .model .LineaTicket ;
918import org .slf4j .Logger ;
1019import org .slf4j .LoggerFactory ;
1120
1221import javax .print .PrintService ;
22+ import java .awt .image .BufferedImage ;
1323import java .io .IOException ;
1424import java .time .LocalDateTime ;
1525import java .time .format .DateTimeFormatter ;
2131import static com .mateo .freetpv .util .ConversionUtil .centimosEuros ;
2232
2333public class ImprimirService {
24- private static final int WIDTH = 32 ;
34+ private static int WIDTH = 32 ;
2535
2636 private static final Logger log = LoggerFactory .getLogger (ImprimirService .class );
2737
28- public static void imprimirTicket (PrintService printService , DatosTicket ticket ) throws IOException {
38+ public static void imprimirTicket (PrintService printService , DatosTicket ticket , int ancho , String codepage , boolean cortar ) throws IOException {
39+ WIDTH = ancho == 58 ? 32 : 48 ;
40+
41+
2942 PrinterOutputStream printerOutputStream = new PrinterOutputStream (printService );
3043 EscPos escpos = new EscPos (printerOutputStream );
3144
@@ -48,9 +61,12 @@ public static void imprimirTicket(PrintService printService, DatosTicket ticket)
4861 String hora = ahora .format (DateTimeFormatter .ofPattern ("HH:mm" ));
4962
5063 escpos .initializePrinter ();
64+ EscPos .CharacterCodeTable charset = switch (codepage ) {
65+ case "CP850" -> EscPos .CharacterCodeTable .CP850_Multilingual ;
66+ default -> EscPos .CharacterCodeTable .CP858_Euro ;
67+ };
68+ escpos .setCharacterCodeTable (charset );
5169
52- // Charset / codepage para tildes y ñ
53- escpos .setCharacterCodeTable (EscPos .CharacterCodeTable .CP858_Euro );
5470
5571 escpos .feed (1 );
5672 escpos .writeLF (centerBold , ticket .nombreEmpresa ());
@@ -131,8 +147,22 @@ public static void imprimirTicket(PrintService printService, DatosTicket ticket)
131147 escpos .feed (1 );
132148 if (ticket .mostrarWeb ()) escpos .writeLF (center , ticket .web ());
133149
150+ if (ticket .mostrarQr () && !ticket .qr ().isBlank ()) {
151+ try {
152+ BitMatrix bitMatrix = new QRCodeWriter ().encode (ticket .qr (), BarcodeFormat .QR_CODE , 200 , 200 );
153+ BufferedImage qrImage = MatrixToImageWriter .toBufferedImage (bitMatrix );
154+
155+ GraphicsImageWrapper imageWrapper = new GraphicsImageWrapper ();
156+ imageWrapper .setJustification (EscPosConst .Justification .Center );
157+ EscPosImage escposImage = new EscPosImage (new CoffeeImageImpl (qrImage ), new BitonalThreshold ());
158+ escpos .write (imageWrapper , escposImage );
159+ } catch (WriterException e ) {
160+ log .error ("Error al dibujar el código QR" , e );
161+ }
162+ }
163+
134164 escpos .feed (2 );
135- escpos .cut (EscPos .CutMode .FULL );
165+ if ( cortar ) escpos .cut (EscPos .CutMode .FULL );
136166 escpos .close ();
137167 }
138168
0 commit comments