Как я могу контролировать ориентацию бумаги при печати на матричном принтере? - PullRequest
1 голос
/ 07 февраля 2012

Я занимаюсь разработкой приложения для управления идентификационными картами на Java, которое заменит устаревшую систему мэйнфреймов, созданную десятилетиями.Необходимые функции включают печать личных данных на карточках, которые питаются от матричного принтера.Размер страницы каждой карты составляет 3,5 дюйма высотой × 8,5 дюйма в ширину.

Чтобы проиллюстрировать мою проблему, программа ниже создает образец распечатки на две страницы с некоторыми данными.

  • Iиспользуйте PDFCreator в качестве принтера, но я выяснил, что с точечно-матричным принтером поведение точно такое же, так что его может проверить любой, кто читает этот пост.
  • Размер страницы и верстка верны, ностраницы поворачиваются на 90 °, поэтому они «подаются» по вертикали.
  • На лазерном принтере это не вызовет проблем, поскольку листы можно подавать и по вертикали (например, конверты Com-10).Но это недопустимо для сгибаемой бумаги на точечном матричном принтере.
  • Кстати, эта согнутая бумага имеет предварительно напечатанный шаблон, поэтому вращение невозможно.
  • Независимо от ориентации страницыЯ использую (т. Е. Помещая параметр OrientationRequested в PrintRequestAttributeSet), кажется невозможным заставить распечатку не поворачиваться, т. Е. Сохранять 3,5 "× 8,5" страницы в их исходной горизонтальной ориентации.
  • При запускеПриведенная ниже программа, единственный способ, которым мне это удалось, состоит в том, чтобы отредактировать расширенные свойства принтера, выбрать пользовательский формат PostScript, установить его размер в вышеупомянутый размер и (ОБЯЗАТЕЛЬНО!) установить направление подачи бумаги на «Короткий край первым».(Это параметры PDFCreator.)

Проблема в том, что, если я не смотрю в нужное место, в Java Print API нет параметров, позволяющих копаться в таких расширенных настройках!

Обратите внимание, что моей конечной целью является печать карточек без вывода сообщений, что эквивалентно отключению условия pjob.printDialog();, указанного ниже.Это еще одна причина, по которой я ищу программный способ применения таких условий к настройкам принтера.

Резервное решение может состоять в том, чтобы моделировать бумагу формата Legal и карточки для печати, как если бы их было четыре на странице (3,5 "× 4 = 14").Если другого решения на самом деле нет, я постараюсь «продать» его своим клиентам, но это действительно последний вариант ...

Любые идеи будут оценены по достоинству, и, пожалуйста, не стесняйтесьзапросить дополнительную точность, если что-то недостаточно ясно ...

Спасибо,

Джефф

import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class PrintTestClean {

  public static void main(String[] args) {
    printAwt();
  }

  private static PrintService getPrintService(String name) {
    PrintService[] pss = PrintServiceLookup.lookupPrintServices(null, null);
    for (PrintService ps : pss) {
      if (name.equals(ps.getName())) {
        return ps;
      }
    }
    return null;
  }

  private static void printAwt() {
    List<Card> cards = new ArrayList<Card>();
    for (int i = 0; i < 1; i++) {
      cards.add(new Card(new Date(), "Morin\nJean-François\nabcdefghijklmnopqrstuvwx", "Personnel de\nl'Université", "123 456 789", new Date()));
      cards.add(new Card(new Date(), "Morin\nJean-François", "Étudiant", "123 456 789", new Date()));
    }

    try {
      // Create Print Job
      PrinterJob pjob = PrinterJob.getPrinterJob();
      PrintService ps = getPrintService("PDFCreator");
      if (ps != null) {
        pjob.setPrintService(ps);
      }

      pjob.setJobName("test.pdf");
      pjob.setPageable(new CardsLayout(cards));

      // Send print job to default printer
      //pjob.print(printRequestAttributeSet);
      if (pjob.printDialog()) {
        pjob.print();
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

}

Вот классы утилит, упомянутые программой выше:

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.util.List;

public class CardsLayout implements Printable, Pageable {

  private static final Font FONT = new Font(Font.MONOSPACED, Font.PLAIN, 9);
  private List<Card> cards;
  private PageFormat pf = new PageFormat();

  public CardsLayout(List<Card> pCards) {
    cards = pCard;

    Paper paper = new Paper();

    // This is one of my countless tests to get a horizontal page layout...
    //paper.setSize(252d, 612d);
    //paper.setImageableArea(0d, 0d, 252d, 612d);
    //pf.setOrientation(PageFormat.LANDSCAPE);
    paper.setSize(612d, 252d);
    paper.setImageableArea(0d, 0d, 612d, 252d);
    pf.setOrientation(PageFormat.PORTRAIT);

    pf.setPaper(paper);
  }

  @Override
  public int getNumberOfPages() {
    return cards.size();
  }

  @Override
  public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
    return pf;
  }

  @Override
  public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
    return this;
  }

  @Override
  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    if (pageIndex < 0 || pageIndex >= getNumberOfPages()) {
      return NO_SUCH_PAGE;
    }

    int hligne = 10;
    Card card = cards.get(pageIndex);

    Graphics2D g2 = (Graphics2D) graphics;
    g2.setFont(FONT);
    int y = 99 - hligne;
    for (String ligne : card.getName().split("\n")) {
      g2.drawString(ligne, 95, y += hligne);
    }

    return PAGE_EXISTS;
  }

}



import java.io.Serializable;
import java.util.Date;

public class Card implements Serializable {

  private static final long serialVersionUID = 7739106764789216176L;
  private Date expirationDate;
  private String name;
  private String status;
  private String personId;
  private Date birthDate;

  public Card() {}

  public Card(Date pExpirationDate, String pName, String pStatus, String pPersonId, Date pBirthDate) {
    expirationDate = pExpirationDate;
    name = pName;
    status = pStatus;
    personId = pPersonId;
    birthDate = pBirthDate;
  }

  public Date getExpirationDate() {
    return expirationDate;
  }

  public void setExpirationDate(Date pExpirationDate) {
    expirationDate = pExpirationDate;
  }

  public String getName() {
    return name;
  }

  public void setName(String pName) {
    name = pName;
  }

  public String getStatus() {
    return status;
  }

  public void setStatus(String pStatus) {
    status = pStatus;
  }

  public String getPersonId() {
    return personId;
  }

  public void setPersonId(String pPersonId) {
    personId = pPersonId;
  }

  public Date getBirthDate() {
    return birthDate;
  }

  public void setBirthDate(Date pBirthDate) {
    birthDate = pBirthDate;
  }

}
...