用 Java 打印到标签打印机 [英] Printing in Java to Label Printer

查看:37
本文介绍了用 Java 打印到标签打印机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法打印到标签打印机.下面的代码在一个(附加标签图片)上打印了 4 个标签".

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

下面的代码打印到兄弟 QL-500 标签打印机.它可以打印到 3.5" x 1.1" 的标签上.

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

这是它打印的内容:

推荐答案

哇,我无法告诉你我有多喜欢用 Java 打印,当它工作时,它很棒......

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

如果您尝试指定纸张尺寸和边距,我知道 PrintDialog 会做一些奇怪而美妙的事情,但老实说,这是另一个问题.

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.

我发布的代码能够在我的 Dymo LabelWriter 400 Turbo 上一个接一个地打印两个标签而不会出现问题

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

更新还应该提到,我认为您基本上缺少 PageFormat.setPaper

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

更新了 Barbaque 条码

从文件示例打印...

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;

    }

}

直接打印到图形上下文

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;

    }

}

最后但并非最不重要的一点,直接从下载的examples"目录

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

    }

}

这篇关于用 Java 打印到标签打印机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆