Edit pom.xml and add escpos-coffee
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dedetok</groupId>
<artifactId>myapp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
<configuration>
<mainClass>com.dedetok.myapp.App</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.dedetok.myapp.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.github.anastaciocintra</groupId>
<artifactId>escpos-coffee</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
</project>
run package or compile to download library
$ mvn compile
Edit App.java
package com.dedetok.myapp;
import com.github.anastaciocintra.escpos.EscPos;
import com.github.anastaciocintra.escpos.EscPosConst;
import com.github.anastaciocintra.escpos.Style;
import com.github.anastaciocintra.output.PrinterOutputStream;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class App extends JFrame {
private JTextArea txtPreview;
private DecimalFormat formatter;
public App() {
setTitle("ESC/POS Receipt Preview");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(420, 700);
setLocationRelativeTo(null);
JPanel root = new JPanel(new GridBagLayout());
root.setBackground(new Color(180, 180, 180));
JPanel paper = new JPanel(new BorderLayout());
paper.setPreferredSize(new Dimension(300, 600));
paper.setBackground(Color.WHITE);
txtPreview = new JTextArea();
txtPreview.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 15));
txtPreview.setEditable(false);
txtPreview.setLineWrap(false);
txtPreview.setBackground(Color.WHITE);
txtPreview.setForeground(Color.BLACK);
txtPreview.setBorder(new EmptyBorder(12, 12, 12, 12));
JScrollPane scroll = new JScrollPane(txtPreview);
scroll.setBorder(null);
paper.add(scroll, BorderLayout.CENTER);
root.add(paper);
add(root);
generatePreview();
// generate ESC/POS binary file
try {
generateEscPosFile();
System.out.println("ESC/POS output saved to output.bin");
} catch (Exception e) {
e.printStackTrace();
}
}
private void generatePreview() {
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator('.');
formatter = new DecimalFormat("#,###", symbols);
StringBuilder sb = new StringBuilder();
sb.append(center("MY COFFEE SHOP")).append("\n");
sb.append(center("Bluetooth ESC/POS")).append("\n");
sb.append(center("Jl. Ubud Bali")).append("\n");
sb.append("--------------------------------\n");
addItem(sb, "Espresso", 2, 18000);
addItem(sb, "Cappuccino", 1, 25000);
addItem(sb, "Croissant", 3, 12000);
sb.append("--------------------------------\n");
sb.append(String.format("%-20s %10s\n",
"SUBTOTAL",
formatter.format(97000)));
sb.append(String.format("%-20s %10s\n",
"TAX",
formatter.format(9700)));
sb.append("--------------------------------\n");
sb.append(String.format("%-20s %10s\n",
"TOTAL",
formatter.format(106700)));
sb.append("\n");
sb.append(center("THANK YOU")).append("\n");
sb.append(center("PLEASE COME AGAIN")).append("\n");
sb.append("\n\n\n");
txtPreview.setText(sb.toString());
}
private void generateEscPosFile() throws IOException {
FileOutputStream fos = new FileOutputStream("output.bin");
EscPos escpos = new EscPos(fos);
Style titleStyle = new Style()
.setJustification(EscPosConst.Justification.Center)
.setBold(true)
.setFontSize(Style.FontSize._2, Style.FontSize._2);
Style centerStyle = new Style()
.setJustification(EscPosConst.Justification.Center);
Style normalStyle = new Style();
escpos.writeLF(titleStyle, "MY COFFEE SHOP");
escpos.writeLF(centerStyle, "Bluetooth ESC/POS");
escpos.writeLF(centerStyle, "Jl. Ubud Bali");
escpos.writeLF("--------------------------------");
addItemEscPos(escpos, "Espresso", 2, 18000);
addItemEscPos(escpos, "Cappuccino", 1, 25000);
addItemEscPos(escpos, "Croissant", 3, 12000);
escpos.writeLF("--------------------------------");
escpos.writeLF(normalStyle,
String.format("%-20s %10s",
"SUBTOTAL",
formatter.format(97000)));
escpos.writeLF(normalStyle,
String.format("%-20s %10s",
"TAX",
formatter.format(9700)));
escpos.writeLF("--------------------------------");
escpos.writeLF(normalStyle,
String.format("%-20s %10s",
"TOTAL",
formatter.format(106700)));
escpos.writeLF("");
escpos.writeLF(centerStyle, "THANK YOU");
escpos.writeLF(centerStyle, "PLEASE COME AGAIN");
escpos.feed(4);
escpos.cut(EscPos.CutMode.FULL);
escpos.close();
fos.close();
}
private void addItemEscPos(EscPos escpos,
String item,
int qty,
int price) throws IOException {
int total = qty * price;
escpos.writeLF(item);
escpos.writeLF(
String.format(
" %2dx %-14s %10s",
qty,
"",
formatter.format(total)
)
);
}
private void addItem(StringBuilder sb,
String item,
int qty,
int price) {
int total = qty * price;
sb.append(item).append("\n");
sb.append(String.format(
" %2dx %-14s %10s\n",
qty,
"",
formatter.format(total)
));
}
private String center(String text) {
int width = 32;
if (text.length() >= width)
return text;
int leftPadding = (width - text.length()) / 2;
return " ".repeat(leftPadding) + text;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new App().setVisible(true);
});
}
}