私は、Java で ID カード管理アプリケーションを開発しています。これは、数十年前の古いメインフレーム システムを置き換えるものです。必要な機能には、ドット マトリックス プリンターで供給されるカードに個人データを印刷する機能が含まれます。各カードのページ サイズは、高さ 3.5 インチ × 幅 8.5 インチです。
私の問題を説明するために、以下のプログラムは、いくつかのデータを含む 2 ページのサンプル プリントアウトを作成します。
- 私は PDFCreator をプリンターとして使用していますが、動作はドット マトリックス プリンターとまったく同じであることがわかったので、この投稿を読んでいる人なら誰でもテストできます。
- ページ サイズとレイアウトは正しいですが、ページが 90° 回転されているため、垂直方向に「フィード」されます。
- レーザー プリンタでは、シートを垂直方向にも送るため (たとえば、Com-10 封筒のように)、これは問題になりません。しかし、これはドット マトリックス プリンターのファンフォールド紙では受け入れられません。
- ちなみに、このファンフォールド紙は型紙が印刷されているので、回転は一切できません。
- 私が使用するページの向きのオプション (つまり、OrientationRequested パラメーターを PrintRequestAttributeSet に入れる) に関係なく、印刷出力を回転させないようにすること、つまり、3.5 インチ × 8.5 インチのページを元の水平方向に保つことは不可能のようです。
- 以下のプログラムを実行するとき、成功した唯一の方法は、プリンターの詳細プロパティを編集し、カスタム PostScript 形式を選択し、そのサイズを前述のサイズに設定し、(必須!) 用紙送り方向を「短辺優先」に設定することです。(これらは PDFCreator のオプションです。)
問題は、私が適切な場所を見ていなければ、Java Print API には、そのような高度な設定を掘り下げることができるオプションがないことです!
私の最終的な目標は、サイレント モードでカードを印刷することであることに注意してください。これは、pjob.printDialog();
以下の条件を無効にすることと同じです。これが、このような条件をプリンター設定に適用するプログラムによる方法を探しているもう 1 つの理由です。
フォールバック ソリューションは、リーガル サイズの用紙をシミュレートし、カードを 4 ページ (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;
}
}