Printing in Java to Label Printer

Printing in Java to Label Printer

Wow, I can't tell you how much I love printing in Java, when it works, it's great...

.

public class PrinterTest {

public static void main(String[] args) {

PrinterJob pj = PrinterJob.getPrinterJob();
if (pj.printDialog()) {
PageFormat pf = pj.defaultPage();
Paper paper = pf.getPaper();
double width = fromCMToPPI(3.5);
double height = fromCMToPPI(8.8);
paper.setSize(width, height);
paper.setImageableArea(
fromCMToPPI(0.25),
fromCMToPPI(0.5),
width - fromCMToPPI(0.35),
height - fromCMToPPI(1));
System.out.println("Before- " + dump(paper));
pf.setOrientation(PageFormat.PORTRAIT);
pf.setPaper(paper);
System.out.println("After- " + dump(paper));
System.out.println("After- " + dump(pf));
dump(pf);
PageFormat validatePage = pj.validatePage(pf);
System.out.println("Valid- " + dump(validatePage));
//Book book = new Book();
//book.append(new MyPrintable(), pf);
//pj.setPageable(book);
pj.setPrintable(new MyPrintable(), pf);
try {
pj.print();
} catch (PrinterException ex) {
ex.printStackTrace();
}
}
}

protected static double fromCMToPPI(double cm) {
return toPPI(cm * 0.393700787);
}

protected static double toPPI(double inch) {
return inch * 72d;
}

protected static String dump(Paper paper) {
StringBuilder sb = new StringBuilder(64);
sb.append(paper.getWidth()).append("x").append(paper.getHeight())
.append("/").append(paper.getImageableX()).append("x").
append(paper.getImageableY()).append(" - ").append(paper
.getImageableWidth()).append("x").append(paper.getImageableHeight());
return sb.toString();
}

protected static String dump(PageFormat pf) {
Paper paper = pf.getPaper();
return dump(paper);
}

public static class MyPrintable implements Printable {

@Override
public int print(Graphics graphics, PageFormat pageFormat,
int pageIndex) throws PrinterException {
System.out.println(pageIndex);
int result = NO_SUCH_PAGE;
if (pageIndex < 2) {
Graphics2D g2d = (Graphics2D) graphics;
System.out.println("[Print] " + dump(pageFormat));
double width = pageFormat.getImageableWidth();
double height = pageFormat.getImageableHeight();
g2d.translate((int) pageFormat.getImageableX(),
(int) pageFormat.getImageableY());
g2d.draw(new Rectangle2D.Double(1, 1, width - 1, height - 1));
FontMetrics fm = g2d.getFontMetrics();
g2d.drawString("0x0", 0, fm.getAscent());
result = PAGE_EXISTS;
}
return result;
}
}
}

I'm aware of a number of inconsistencies with the PrintDialog doing werid and wonderful things if you try and specify Paper sizes and margins, but honestly, that's a question for another day.

The code I've posted was capable for printing two labels one after the other without issue on my Dymo LabelWriter 400 Turbo

UPDATED
Should also mention, I think you were basically missing PageFormat.setPaper

UPDATED with Barbaque BarCode

Print from file example...

Barcode b = BarcodeFactory.createCode128("Hello");
b.setResolution(72);

File f = new File("mybarcode.png");
// Let the barcode image handler do the hard work
BarcodeImageHandler.savePNG(b, f);

.
.
.

public static class PrintFromFile implements Printable {

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

int result = NO_SUCH_PAGE;
if (pageIndex == 0) {

graphics.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());

result = PAGE_EXISTS;

try {

// You may want to rescale the image to better fit the label??
BufferedImage read = ImageIO.read(new File("mybarcode.png"));
graphics.drawImage(read, 0, 0, null);

} catch (IOException ex) {

ex.printStackTrace();

}

}

return result;

}

}

Printing direct to the Graphics context

Barcode b = BarcodeFactory.createCode128("Hello");
b.setResolution(72);

.
.
.

public static class PrintToGraphics implements Printable {

private Barcode b;

private PrintToGraphics(Barcode b) {

this.b = b;

}

@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {

int result = NO_SUCH_PAGE;
if (pageIndex == 0) {

result = PAGE_EXISTS;

int x = (int)pageFormat.getImageableX();
int y = (int)pageFormat.getImageableY();

int width = (int)pageFormat.getImageableWidth();
int height = (int)pageFormat.getImageableHeight();

graphics.translate(x, y);
try {
b.draw((Graphics2D)graphics, 0, 0);
} catch (OutputException ex) {

ex.printStackTrace();

}

}

return result;

}

}

Last but not least, directly from the "examples" directory of the download

public class PrintingExample
{

public static void main(String[] args)
{
try
{
Barcode b = BarcodeFactory.createCode128("Hello");
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(b);
if (job.printDialog())
{
job.print();
}
}
catch (Exception e)
{
e.printStackTrace();
}

}

}

Printing in Java to a label printer that is not default printer

public static void main(String[] args) {
try
{
FileInputStream fis = new FileInputStream("c:\\N0018902726.pdf");
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
DocAttributeSet das = new HashDocAttributeSet();
Doc pdfDoc = new SimpleDoc(fis, flavor, null);
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob printJob = printService.createPrintJob();
printJob.print(pdfDoc, new HashPrintRequestAttributeSet());
fis.close();
}
catch (Exception e) {
System.out.println("EXCEPTIOn : " +e.getMessage());

}
}

How can I print a label with FBPL and Java on Brother Label Printer (TD-4750TNWB) in a Linux environment?

Using java you will have to write the hex representation of the commands you want to send.

Then from java you will need to call lpr -P Brother-TD4750 -l brotherHexVersion.txt

https://explainshell.com/explain/1/lpr

How to run Linux commands in Java?

These answers will give you more insight on other problmens you might encounter:

How to send ESC/POS commands to thermal printer in Linux



Related Topics



Leave a reply



Submit