Печать счета в Java с различными размерами шрифта - PullRequest
0 голосов
/ 28 июня 2019

Я использую приведенный ниже код для печати счета.Я форматирую счет в строку и перехожу к этому коду.Это работает нормально.но мне нужно добавить статический текст и увеличить размер текста.(Название магазина).Есть ли способ сделать это с помощью этого подхода, или мне нужно найти совершенно другой подход.

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;

Этокак я форматирую строку.но не знаю, как увеличить размер текста.

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Вы печатаете простой текст. По определению, простой текст не имеет информации о шрифте и отображается полностью одним и тем же шрифтом. В большинстве принтеров решением было бы создать простой HTML-документ и распечатать его как DocFlavor.STRING.TEXT_HTML или создать компонент расширенного текста, такой как JEditorPane , и использовать его унаследованный метод печати, который принимает PrintService .

Но ваш случай - особый случай. Вы печатаете на матричном принтере . Честно говоря, я не знаю, можно ли вообще печатать графику; принтер поддерживает монохромную графику, но собственный драйвер принтера может предоставлять или не предоставлять такую ​​возможность способом, совместимым с 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) выключает подчеркивание.

0 голосов
/ 28 июня 2019

Этот код содержит содержимое счета-фактуры, который должен быть напечатан в строке, и, безусловно, может редактировать эту строку до ее печати.Поэтому на первый взгляд кажется, что вы, безусловно, могли бы делать то, что вы просите, с помощью этого кода.

Интересно, однако, если это то, где вы должны это делать.Этот код, по-видимому, отвечает за печать документа, не зная ничего о его содержимом или даже о типе файла.Чтобы этот код вносил изменения в документ, ему придется взять на себя совершенно новую роль и понять формат и содержание документов, которые он печатает.

Здесь недостаточно информации, чтобы дать какие-либо конкретные указания покуда должна идти логика, которая изменяет содержимое документа.Моя интуиция говорит, что это не относится к этому ... что может быть где-то ранее в процессе, который уже знает содержание документа, и что изменения, которые вы хотите внести, должны применяться там.Но если это единственное место, где могут быть внесены эти изменения, я не вижу причин, по которым этот код не может изменить строку, переданную ему, практически любым возможным способом перед его печатью.Просто нужно знать достаточно, чтобы сделать это правильно, что опять-таки является функцией специфических особенностей, не представленных здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...