java - 用Java打印不同字体大小的发票

标签 java

我正在使用下面的代码来打印发票。我将发票格式化为字符串并传递给此代码。这工作正常。但我需要添加一些静态文本并增加文本大小。 (商店名称)。有什么办法可以用这种方法来做到这一点,还是我需要找到一种完全不同的方法。

import java.awt.print.PrinterJob;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;


public class GenerateInvoice {

    public static void printInvoice(String invoice) throws IOException {
      try {
          PrintService mPrinter = null;
          Boolean bFoundPrinter = false;

          PrintService[] printServices = PrinterJob.lookupPrintServices();

          for (PrintService printService : printServices) {
              String sPrinterName = printService.getName();
              if (sPrinterName.equals("EPSON LQ-310")) {
                  mPrinter = printService;
                  bFoundPrinter = true;
              }
          }
          String testData = invoice+"\f";
          InputStream is = new ByteArrayInputStream(testData.getBytes());
          DocFlavor flavor =  DocFlavor.INPUT_STREAM.AUTOSENSE   ;

          PrintService service = PrintServiceLookup.lookupDefaultPrintService();
          System.out.println(service);

          DocPrintJob job = service.createPrintJob();
          Doc doc= new SimpleDoc(is, flavor, null);

          PrintJobWatcher pjDone = new PrintJobWatcher(job);

          job.print(doc, null);

          pjDone.waitForDone();

          is.close();
      } catch (PrintException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      }
  }
  static class PrintJobWatcher {
      boolean done = false;

      PrintJobWatcher(DocPrintJob job) {
          // Add a listener to the print job
          job.addPrintJobListener(new PrintJobAdapter() {
              public void printJobCanceled(PrintJobEvent pje) {
                  allDone();
              }
              public void printJobCompleted(PrintJobEvent pje) {
                  allDone();
              }
              public void printJobFailed(PrintJobEvent pje) {
                  allDone();
              }
              public void printJobNoMoreEvents(PrintJobEvent pje) {
                  allDone();
              }
              void allDone() {
                  synchronized (PrintJobWatcher.this) {
                      done = true;
                      PrintJobWatcher.this.notify();
                  }
              }
          });
      }
      public synchronized void waitForDone() {
          try {
              while (!done) {
                  wait();
              }
          } catch (InterruptedException e) {
          }
      }
  }

}

请给我一些帮助来解决这个问题。

String head = String.format("%30s\n\n", "   TITLE   ");
String s = String.format("%5s %10s %15s %20s\n", "Description","Unit","Quantity","Net Amount");
String output = head + s;

这就是我格式化字符串的方式。但不知道如何增加文本大小。

最佳答案

您正在打印纯文本。根据定义,纯文本没有字体信息,并且完全以相同的字体显示。对于大多数打印机,解决方案是创建一个简单的 HTML 文档并将其打印为 DocFlavor.STRING.TEXT_HTML ,或者创建一个富文本组件,如 JEditorPane并使用其继承的 print method which takes a PrintService .

但是,你的情况是一个特殊情况。您正在打印到 dot matrix printer 。老实说,我根本不知道你是否可以打印图形;打印机能够打印单色图形,但 native 打印机驱动程序可能会也可能不会以与 Java Printable 兼容的方式提供该功能。 .

但是,打印机似乎支持 ESC/P2 打印机转义码。这意味着您可以以双宽模式打印一些文本:

String title = "TITLE";
String titleIndent = 32 - title.length;
String head = String.format("%" + titleIndent + "s\n\n", "\u000e" + title);

“\u000e” 是 ESC/P2 字符,它为该行的其余部分启用双宽字符。请参阅http://lprng.sourceforge.net/DISTRIB/RESOURCES/PPD/epson.htm .

您可能还想在它下划线:

String head = String.format("%" + titleIndent + "s\n\n",
    "\u001b-1\u000e" + title + "\u001b-0");

"\u001b-1"(ESC 连字符 1)打开下划线,并且 “\u001b-0”(ESC 连字符 0)关闭下划线。

关于java - 用Java打印不同字体大小的发票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811672/

相关文章:

java - 谷歌眼镜中的 Hello World

java - Hibernate - 在字段中存储 oneToMany-Relation 中的元素数量? (例如评论数量)

java - 更改 Java 安全级别

java - 当我输入正确的值 1-99 时,我仍然遇到异常

Java:不支持的内容编码:text/xml posting text/xml

java - 在 Java 中的对象集合上推广迭代函数

java - Sling 远程 Junit 测试用例

带有 "expressions"的 Java 类型提升

java - 使用 Java 对象作为 Map 键的问题

java - java中的返回问题