142 lines
3.4 KiB
Java
142 lines
3.4 KiB
Java
|
/**
|
||
|
* some parts are from http://www.mets-blog.com/java-pos-thermal-printer-example/
|
||
|
*/
|
||
|
|
||
|
package com.jFxKasse.controller;
|
||
|
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Graphics2D;
|
||
|
import java.awt.print.PageFormat;
|
||
|
import java.awt.print.Printable;
|
||
|
import java.awt.print.PrinterException;
|
||
|
import java.awt.print.PrinterJob;
|
||
|
import java.nio.charset.StandardCharsets;
|
||
|
|
||
|
import javax.print.Doc;
|
||
|
import javax.print.DocFlavor;
|
||
|
import javax.print.DocPrintJob;
|
||
|
import javax.print.PrintService;
|
||
|
import javax.print.PrintServiceLookup;
|
||
|
import javax.print.SimpleDoc;
|
||
|
import javax.print.attribute.HashPrintRequestAttributeSet;
|
||
|
import javax.print.attribute.PrintRequestAttributeSet;
|
||
|
|
||
|
public class PrinterController implements Printable
|
||
|
{
|
||
|
// All available Printers on this system
|
||
|
private PrintService[] printService;
|
||
|
|
||
|
// selected printer
|
||
|
private PrintService selectedPrinter;
|
||
|
|
||
|
private DocFlavor flavor;
|
||
|
|
||
|
public PrinterController()
|
||
|
{
|
||
|
flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return A String array with all available printers
|
||
|
*/
|
||
|
public String[] getAvailablePrinters()
|
||
|
{
|
||
|
int printerSize = PrinterJob.lookupPrintServices().length;
|
||
|
String printers[] = new String[printerSize];
|
||
|
|
||
|
for (int i = 0; i < printers.length; i++) {
|
||
|
printers[i] = this.printService[i].getName();
|
||
|
}
|
||
|
return printers;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* searchs connected printers on the system
|
||
|
*/
|
||
|
public void searchPrinters()
|
||
|
{
|
||
|
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
|
||
|
this.printService = PrintServiceLookup.lookupPrintServices(flavor, pras);
|
||
|
String printers[] = getAvailablePrinters();
|
||
|
System.out.println("Printers found:");
|
||
|
System.out.println("++++++++++++++++++++");
|
||
|
for (int i = 0; i < printers.length; i++) {
|
||
|
System.out.println(printers[i]);
|
||
|
}
|
||
|
System.out.println("++++++++++++++++++++");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Selects the printer via its name
|
||
|
* @param printerName
|
||
|
*/
|
||
|
public void selectPrinter(String printerName)
|
||
|
{
|
||
|
String printers[] = getAvailablePrinters();
|
||
|
|
||
|
for (int i = 0; i < printers.length; i++) {
|
||
|
if (printerName.equals(printers[i])) {
|
||
|
selectedPrinter = printService[i];
|
||
|
System.out.println("Printer: " + printers[i] + " selected");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @param input data as String
|
||
|
*/
|
||
|
public void printString(String text)
|
||
|
{
|
||
|
|
||
|
PrintService service = selectedPrinter;
|
||
|
DocPrintJob job = service.createPrintJob();
|
||
|
|
||
|
try {
|
||
|
byte[] bytes;
|
||
|
bytes = text.getBytes(StandardCharsets.UTF_8);
|
||
|
Doc doc = new SimpleDoc(bytes, flavor, null);
|
||
|
job.print(doc, null);
|
||
|
} catch (Exception e) {
|
||
|
// TODO Auto-generated catch block
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int print(Graphics g, PageFormat pf, int page) throws PrinterException
|
||
|
{
|
||
|
if (page > 0) { /* We have only one page, and 'page' is zero-based */
|
||
|
return NO_SUCH_PAGE;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* User (0,0) is typically outside the imageable area, so we must
|
||
|
* translate by the X and Y values in the PageFormat to avoid clipping
|
||
|
*/
|
||
|
Graphics2D g2d = (Graphics2D) g;
|
||
|
g2d.translate(pf.getImageableX(), pf.getImageableY());
|
||
|
/* Now we perform our rendering */
|
||
|
return PAGE_EXISTS;
|
||
|
}
|
||
|
|
||
|
public void printBytes(byte[] bytes)
|
||
|
{
|
||
|
PrintService service = selectedPrinter;
|
||
|
DocPrintJob job = service.createPrintJob();
|
||
|
|
||
|
try {
|
||
|
Doc doc = new SimpleDoc(bytes, flavor, null);
|
||
|
job.print(doc, null);
|
||
|
} catch (Exception e) {
|
||
|
e.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void cutPaper()
|
||
|
{
|
||
|
byte[] cutP = new byte[] { 0x1d, 'V', 1 };
|
||
|
printBytes(cutP);
|
||
|
}
|
||
|
}
|