简体   繁体   English

用 Java 打印到标签打印机

[英]Printing in Java to Label Printer

I am having trouble printing to a label printer.我在使用标签打印机打印时遇到问题。 The code below prints 4 "labels" on one (Picture of Label Attached).下面的代码在一个上打印 4 个“标签”(附有标签图片)。

The code below prints to a brother QL-500 label printer.下面的代码打印到兄弟 QL-500 标签打印机。 It prints onto 3.5" by 1.1" labels.它打印到 3.5" x 1.1" 的标签上。

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:这是它打印的内容:

Wow, I can't tell you how much I love printing in Java, when it works, it's great...哇,我无法告诉你我有多喜欢用 Java 打印,当它工作时,它很棒......

. .

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.如果您尝试指定纸张大小和边距,我知道 PrintDialog 会做一些奇怪而美妙的事情,但老实说,这是另一天的问题。

The code I've posted was capable for printing two labels one after the other without issue on my Dymo LabelWriter 400 Turbo我发布的代码能够在我的 Dymo LabelWriter 400 Turbo 上一个接一个地打印两个标签而没有问题

UPDATED Should also mention, I think you were basically missing PageFormat.setPaper更新还应该提到,我认为你基本上缺少PageFormat.setPaper

UPDATED with Barbaque BarCode更新了 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最后但同样重要的是,直接从下载的“examples”目录

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

    }

}

在此处输入图像描述

    #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

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.我有一个类似的代码,但不能使东芝便携式打印机在 TPCL 模式下打印,我的代码工作正常,但只有当打印机处于 ESC/POS 模式时。 My printer is Toshiba B-EP4-DL我的打印机是东芝 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);
 }

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM