13

I am having trouble printing to a label printer. The code below prints 4 "labels" on one (Picture of Label Attached).

The code below prints to a brother QL-500 label printer. It prints onto 3.5" by 1.1" labels.

It would also be great if someone could help me better understand the code.

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import javax.print.PrintService;



public class DYMOLabelPrintConnector implements Printable {

public static final String PRINTERNAME = "DYMO LabelWriter 400";


public static final boolean PRINTMENU = false;

public static void main(String[] args) {
PrinterJob printerJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = printerJob.defaultPage();
Paper paper = new Paper();

final double widthPaper = (1.2 * 72);
final double heightPaper = (1.5 * 72);

paper.setSize(widthPaper, heightPaper);
paper.setImageableArea(0, 0, widthPaper, heightPaper);

pageFormat.setPaper(paper);

pageFormat.setOrientation(PageFormat.LANDSCAPE);

if (PRINTMENU) {
  if (printerJob.printDialog()) {
    printerJob.setPrintable(new DYMOLabelPrintConnector(), pageFormat); 

    try {
      printerJob.print();
    } catch (PrinterException e) {
      e.printStackTrace();
    }
  }
} else {
  PrintService[] printService = PrinterJob.lookupPrintServices();

  for (int i = 0; i < printService.length; i++) {
    System.out.println(printService[i].getName());

    if (printService[i].getName().compareTo(PRINTERNAME) == 0) {
      try {
        printerJob.setPrintService(printService[i]);
        printerJob.setPrintable(new DYMOLabelPrintConnector(), pageFormat); 
        printerJob.print();
      } catch (PrinterException e) {
        e.printStackTrace();
      }
    }
  }
}

System.exit(0);
 }

  public String getValue(final int elementOnLabel, final int labelCounter) {
  String value = "";

switch (elementOnLabel) {
case 0:
  // what ever you want to have in this line
  value = "SetupX";

  break;

case 1:
    // what ever you want to have in this line
  value = "fiehnlab.ucd";

  break;

case 2:
    // what ever you want to have in this line
  value = "id: " + labelCounter;

  break;

case 3:
    // what ever you want to have in this line
  // TODO - add DB connection
  value = "label:" + elementOnLabel;

  break;

case 4:
    // what ever you want to have in this line
  value = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).format(new Date());

  break;

default:
  break;
}

return value;
}


public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
System.out.println("printing page: " + pageIndex);

   if (pageIndex < getPageNumbers()) {
    Graphics2D g = (Graphics2D) graphics;

  // g.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
  g.translate(20, 10);

  String value = "";
  pageIndex = pageIndex + 1;

  // specific for four circular labels per page
  for (int x = 0; x < 80; x = x + 50) {
    for (int y = 0; y < 80; y = y + 36) {
      int posOnPage = 4; // BottomRight, TopRight, BottomLeft, TopLeft 

      if (x > 0) {
        posOnPage = posOnPage - 2;
      }

      if (y > 0) {
        posOnPage = posOnPage - 1;
      }

      // current counter for the label.
      int id = (posOnPage - 1) + ((pageIndex - 1) * 4);

      // setupx
      g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 3));
      value = this.getValue(0, id);
      g.drawString("      " + value, x, y);

      // fiehnlab
      g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 3));
      value = this.getValue(1, id);
      g.drawString("    " + value, x, y + 4);

      // ID
      g.setFont(new Font(g.getFont().getFontName(), Font.BOLD, 7));
      value = this.getValue(2, id);
      g.drawString("" + value, x, y + 10);

      // label
      g.setFont(new Font(g.getFont().getFontName(), g.getFont().getStyle(), 5));
      value = this.getValue(3, id);
      g.drawString(" " + value, x, y + 16);

      // date
      g.setFont(new Font(g.getFont().getFontName(), Font.PLAIN, 3));
      value = this.getValue(4, id);
      g.drawString("      " + value, x, y + 20);
    }
  }

  return PAGE_EXISTS;
} else {
  return NO_SUCH_PAGE;
}
}

public int getPageNumbers() {
return 5;
 }
 }

enter code here

Here is What it Prints:

Markus Pscheidt
  • 6,853
  • 5
  • 55
  • 76
Riley Childs
  • 189
  • 2
  • 3
  • 10
  • I can't prevent it from printing 4 of the same thing on a label as the picture shows – Riley Childs Aug 03 '12 at 23:08
  • You "may" be in luck, I just happen to have a DYMO LabelWriter 400, I'll have a play and see what I can discover – MadProgrammer Aug 04 '12 at 00:13
  • Hello Friend's i was struggling with printing bar-code in label printing machine (Not A4 size paper). At small printer (Label printer ) there is print alignment issues . so found good solution here . https://stackoverflow.com/questions/11803741/printing-in-java-to-label-printer/63502162#63502162 – Avinash Khadsan Aug 21 '20 at 16:46

3 Answers3

22

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();
        }

    }

}
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
  • Will this prompt me to select a printer? – Riley Childs Aug 04 '12 at 14:12
  • how do I make it print straight to the printer? also how do I make it create a barcode? – Riley Childs Aug 04 '12 at 17:13
  • @RileyChilds 1- yes; 2- it does print directly to the printer & if you do a quick Google search for Java barcode generator, you'll find a number of open source libraries that should meet you needs – MadProgrammer Aug 04 '12 at 19:47
  • I want it to print WITHOUT the diolog – Riley Childs Aug 05 '12 at 13:15
  • Ok I figured the diologless printing out! how do I add the Barbecue Barcode to the label – Riley Childs Aug 05 '12 at 14:39
  • With no experience with the API, I'd suggest that you output the barcode to one of the supported image formats and render the image directly to the graphics object within the print method – MadProgrammer Aug 05 '12 at 20:15
  • I'd also take a closer look at the Barcode class, it on trains a draw method http://barbecue.sourceforge.net/apidocs/net/sourceforge/barbecue/Barcode.html – MadProgrammer Aug 05 '12 at 20:18
  • May I have an example? Pretty Please. I can't find one online – Riley Childs Aug 05 '12 at 21:16
  • How would I use GRAPHICS2D to retrieve an image from C:\codes\code1234.jpg – Riley Childs Aug 06 '12 at 17:54
  • @RileyChilds Again, I have no experience with Barbeque BarCode API, so what I've done is pretty basic. But check the updates – MadProgrammer Aug 06 '12 at 20:53
  • Many, many thanks for this answer; gave me tons of inspiration. Your code example works fine for a (Brother) QL-570. – Zar Dec 07 '12 at 17:10
  • @MadProgrammer I see your answer, and it seems you are Great in printing functions in Java, I think may you have any idea about my problem here please Thanks in advance! http://stackoverflow.com/questions/27201302/endorsement-epson-tm-h6000iv-java-printing – Maheera Jazi Dec 01 '14 at 07:00
1

enter image description here

    #After a long hour of analysis found 100% solution     
    
    
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.math.BigInteger;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.util.Units;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDocument1;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageSz;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STPageOrientation;
    
    public class CreateWord {
        public static void main(String[] args) throws FileNotFoundException, IOException {
            XWPFDocument doc = new XWPFDocument();
    
            CTDocument1 document = doc.getDocument();
            CTBody body = document.getBody();
    
            if (!body.isSetSectPr()) {
                body.addNewSectPr();
            }
            CTSectPr section = body.getSectPr();
    
            if (!section.isSetPgSz()) {
                section.addNewPgSz();
            }
    
            if (!section.isSetPgMar()) {
                CTPageMar margin = section.addNewPgMar();
                margin.setTop(BigInteger.valueOf(500));
                margin.setBottom(BigInteger.valueOf(100));
                margin.setLeft(BigInteger.valueOf(0));
                margin.setRight(BigInteger.valueOf(0));
            }
            CTPageSz pageSize = section.getPgSz();
    
            pageSize.setOrient(STPageOrientation.LANDSCAPE);
            pageSize.setW(BigInteger.valueOf(6000));
            pageSize.setH(BigInteger.valueOf(2000));
    
            XWPFParagraph title = doc.createParagraph();
            XWPFRun run = title.createRun();
            // run.setText("Fig.1 A Natural Scene");
            // run.setBold(true);
            // title.setAlignment(ParagraphAlignment.CENTER);
    
            String imgFile = "E:\\barcode.png";
            FileInputStream is = new FileInputStream(imgFile);
            // run.addBreak();
            try {
                run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, imgFile, Units.toEMU(300), Units.toEMU(70));
            } catch (InvalidFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // 200x200
                // pixels
            is.close();
    
            FileOutputStream fos = new FileOutputStream("E:\\test4.docx");
            doc.write(fos);
            fos.close();
        }
    }


  [1]: https://i.stack.imgur.com/VA0IL.png
  [2]: https://i.stack.imgur.com/9aSv4.png
Avinash Khadsan
  • 441
  • 3
  • 6
0

I have a similar code, but can't make the Toshiba portable printer print in TPCL mode, my code works fine but only when the printer is in ESC/POS mode. My printer is Toshiba B-EP4-DL

This is my MainActivity:

 package com.example.warehousev3;

 import android.app.Activity;
 import android.content.Intent;
 import android.database.Cursor;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.View;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;

 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;

 import com.mazenrashed.printooth.Printooth;
 import com.mazenrashed.printooth.data.printable.Printable;
 import com.mazenrashed.printooth.data.printable.RawPrintable;
 import com.mazenrashed.printooth.data.printable.TextPrintable;
 import com.mazenrashed.printooth.data.printer.DefaultPrinter;
 import com.mazenrashed.printooth.ui.ScanningActivity;
 import com.mazenrashed.printooth.utilities.Printing;
 import com.mazenrashed.printooth.utilities.PrintingCallback;

 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;

 public class MainActivity extends AppCompatActivity implements PrintingCallback {
 DatabaseHelper myDb;
 Button btnPrint, btn_unpair_pair;
 EditText barcodefield = null;

 Printing printing;

 private Calendar calendar;
 private SimpleDateFormat dateFormat;
 private String date;

 private final static char ESC_CHAR = 0x1B; // to be used on esc/pos commands

 @Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

calendar = Calendar.getInstance();
dateFormat = new SimpleDateFormat("dd/MM/yyyy");
date = dateFormat.format(calendar.getTime());

myDb = new DatabaseHelper(this);
btnPrint = findViewById(R.id.cmd_print);
barcodefield = findViewById(R.id.txt_barcode);
btn_unpair_pair = findViewById(R.id.btnPiarUnpair);

btnPrint.setVisibility(View.GONE); //Set Print Button Invisible

viewAll();
}

public void viewAll() {
if (printing != null)
    printing.setPrintingCallback(this);

btn_unpair_pair.setOnClickListener(view -> {
    if (Printooth.INSTANCE.hasPairedPrinter())
        Printooth.INSTANCE.removeCurrentPrinter();
    else {
        startActivityForResult(new Intent(MainActivity.this, ScanningActivity.class), ScanningActivity.SCANNING_FOR_PRINTER);
        changePairAndUpair();
    }
});

/*      //Print Button function
btnPrint.setOnClickListener(view -> {
    if (!Printooth.INSTANCE.hasPairedPrinter())
        startActivityForResult(new Intent(MainActivity.this, 
ScanningActivity.class), ScanningActivity.SCANNING_FOR_PRINTER);
    else
        printText();
        barcodefield.setText("");
});
*/

barcodefield.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }
    @Override
    public void afterTextChanged(Editable s) {
        for (int i = 0; i < s.length(); i++) {
            if(barcodefield.getText().toString().length() == 13) {
                if (!Printooth.INSTANCE.hasPairedPrinter())
                    startActivityForResult(new Intent(MainActivity.this, ScanningActivity.class), ScanningActivity.SCANNING_FOR_PRINTER);
                else
                    printText();
                    barcodefield.setText("");
            }
        }
    }
});
changePairAndUpair();
 }

 private void changePairAndUpair() {
 if (Printooth.INSTANCE.hasPairedPrinter())
    btn_unpair_pair.setText(new StringBuilder("Unpair           
 ").append(Printooth.INSTANCE.getPairedPrinter().getName()).toString());
 else
     btn_unpair_pair.setText("Pair with Printer");
 }

 @Override
 public void connectingWithPrinter() {
 Toast.makeText(this, "Connectiong to printer", Toast.LENGTH_SHORT).show();
 }

 @Override
 public void connectionFailed(String s) {
 Toast.makeText(this, "Failed: "+s, Toast.LENGTH_SHORT).show();
 }

 @Override
 public void onError(String s) {
 Toast.makeText(this, "Error: "+s, Toast.LENGTH_SHORT).show();

 }

 @Override
 public void onMessage(String s) {
 Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
 }

 @Override
 public void printingOrderSentSuccessfully() {
 Toast.makeText(this, "Order sent to printer", Toast.LENGTH_SHORT).show();
 }

 private void printText() {
 ArrayList<Printable> printables = new ArrayList<>();
 printables.add(new RawPrintable.Builder(new byte[]{27, 100, 4}).build());       

 //Original Code
 //printables.add(new RawPrintable.Builder(new byte[]{0x1B,'d', 5}).build()); //     
 FEED 5 LINES WORKING!!!!!!!!
 //printables.add(new RawPrintable.Builder(new byte[]{'L','H', 0x56}).build()); // 
 FEED 10 LINES WORKING!!!!!!!!
 //printables.add(new RawPrintable.Builder(new byte[]{}).build()); // lane for  
 test

myDb.setBarcodcheck(String.valueOf(barcodefield.getText()));
Cursor res = myDb.getAllData();
if (res.getCount() == 0) {
    showMessage("Error", "Nothing Found");
    return;
}
StringBuffer buffer = new StringBuffer();
while (res.moveToNext()) {
    buffer.append(res.getString(0)+"\n");
    buffer.append(res.getString(1)+"\n");
    buffer.append(res.getString(2)+"\n");
    buffer.append(date+"\n");
    buffer.append("\n");
}
printables.add(new TextPrintable.Builder()
        .setText(buffer.toString()) // Original code
        //.setText(String.valueOf(buffer))
        .setCharacterCode(DefaultPrinter.Companion.getCHARCODE_PC1252())
        .setLineSpacing(DefaultPrinter.Companion.getLINE_SPACING_60())
        .setEmphasizedMode(DefaultPrinter.Companion.getEMPHASIZED_MODE_BOLD())
        .setFontSize(DefaultPrinter.Companion.getFONT_SIZE_LARGE())
        //.setNewLinesAfter(1)
        .build());
//printables.add(new RawPrintable.Builder(new byte[]{0x1B,'d', 5}).build()); // FEED 5 LINES WORKING!!!!!!!!
//printables.add(new RawPrintable.Builder(new byte[]{}).build()); // Line for test
Printooth.INSTANCE.printer().print(printables);

}

 public void showMessage(String title, String Message) {
 AlertDialog.Builder builder = new AlertDialog.Builder(this);
 builder.setCancelable(true);
 builder.setTitle(title);
 builder.setMessage(Message);
 builder.show();
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent  
 data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (requestCode == ScanningActivity.SCANNING_FOR_PRINTER && resultCode ==    
 Activity.RESULT_OK)
    initPrinting();
    changePairAndUpair();
 }

 private void initPrinting() {
 if (!Printooth.INSTANCE.hasPairedPrinter())
    printing = Printooth.INSTANCE.printer();
 if (printing != null)
    printing.setPrintingCallback(this);
 }

}

Rod
  • 1
  • 2