プロが教えるわが家の防犯対策術!

JavaでPNGファイルを印刷をしようとしています。
MediaSizeName sizeName = MediaSize.findMedia(x, y, Size2DSyntax.INCH);
↑のようにMediaSizeを取得しました。
1回目の実行では「6 in Page 3.14x6in 48c」という値が取得できたのですが、
2回目以降の実行では、sizeNameにnullが入ってきてしまいます。

原因を探っていますが、どこを調べればよいのかも分からない常態です。
なにかヒントをいただけないでしょうか?お願いします。

環境
Eclipse 3.0.1
j2sdk1.4.2_12
tomcat-5.0.28


-------------------------------------------------------------------------------
ソースの概要は以下のとおりです。
-------------------------------------------------------------------------------
FileInputStream filseStream = new FileInputStream("c:\\sample\\sample.png");
DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
Doc myDoc = new SimpleDoc(filseStream, myFormat, null);

float x = Float.parseFloat("3.14");
float y = Float.parseFloat("6");
MediaSizeName sizeName = MediaSize.findMedia(x, y, Size2DSyntax.INCH);

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(1));
aset.add(sizeName);

PrintService[] services = PrintServiceLookup.lookupPrintServices(myFormat, aset);
DocPrintJob job = services[0].createPrintJob();
job.print(myDoc, aset);

-------------------------------------------------------------------------------

A 回答 (1件)

素人です。


印刷APIは全くわからないので、
回答ではありませんが、、
ちょっと思ったこと。
---

1.単に
「メディアサイズ名」を直接に指定すればいいのでは?
「サイズ」から(「メディアサイズ名」を)判別しようとするのではなく。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …

---
2.
>aset.add(sizeName);

たぶんここで「メディアサイズ名の指定」をしない場合は、
「デフォルトの」メディアサイズ名が(内部で)使われるような気がします。


3.
>MediaSizeを取得しました。
>1回目の実行では「6 in Page 3.14x6in 48c」という値が取得できたのですが、
>2回目以降の実行では、sizeNameにnullが入ってきてしまい

この部分がよくわからないのですが…。
■『「6 in Page 3.14x6in 48c」という値』とは、なんの値?
 sizeNameインスタンスのの文字列表現(toString()の値)でしょうか。
■「1回目」「2回目」の意味が、よくわからないのですが…。
 findMedia()でnullが返ってきてもそれは仕様のようです。
 ですから、nullが返ってきても「不思議ではありません」。
 
 しかしこれが、
 「全く同じプログラムなのに、
 その実行のたびにfindMedia()の返り値がまちまち」
 だと「不思議」ですが…。

この回答への補足

findMedia()の返り値がまちまちな問題は、まだ解決していないのですが、
kacchannさんに教えていただいた、「メディアサイズ名」を直接に指定する
方法を試してみることにしました。

今までは、下記のように、フレーバと属性を指定して印刷サービスを探していました。
なので「MediaSizeName.ISO_AA」のような用紙サイズの属性を指定して
印刷サービスを探すと、目的のプリンタを見つけることができませんでした。

◆変更前

DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
MediaSizeName mediaSizeName = MediaSize.findMedia(3.14f, 6f, Size2DSyntax.INCH);
aset.add(mediaSizeName);
PrintService[] services = PrintServiceLookup.lookupPrintServices(myFormat, aset);



目的のプリンタをデフォルトプリンタに設定し、
属性やフレーバを指定しないで印刷サービスを取得するようにしました。
レシートプリンタにはA5というサイズはありませんが、
3.14インチx6インチより大きいサイズを指定すると、
印刷できるようになりました。

◆変更後

PrintService myDefService = PrintServiceLookup.lookupDefaultPrintService();
DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A5);
DocPrintJob job = myDefService.createPrintJob();


無理やりサイズを指定しているせいなのか、
先頭に少し余白がついているような気がします。
また、実際の画像より少し大きく印刷されているような気がしますが、
とりあえず今回はこの方法で、進めようかと思います。

kacchannさん。
本当にありがとうございました。

補足日時:2006/06/29 14:14
    • good
    • 0
この回答へのお礼

kacchannさん。回答ありがとうございます。

>1.単に
>「メディアサイズ名」を直接に指定すればいいのでは?

実はレシートプリンタで印刷しているので、通常サイズの用紙がありません。
ですので、「メディアサイズ名」を判別しようとしていました。


>この部分がよくわからないのですが…。
>■『「6 in Page 3.14x6in 48c」という値』とは、なんの値?
> sizeNameインスタンスのの文字列表現(toString()の値)でしょうか。

説明不足ですみません。
「6 in Page 3.14x6in 48c」は、toString()の値です。


>■「1回目」「2回目」の意味が、よくわからないのですが…。
> findMedia()でnullが返ってきてもそれは仕様のようです。
> ですから、nullが返ってきても「不思議ではありません」。
> 

表現が変でしたね。すみません。
いろいろ試してみましたが、ごくたまにfindMedia()の返り値が
「6 in Page 3.14x6in 48c」になります。
たいていは、nullが返ってきてしまいます。


> 「全く同じプログラムなのに、
> その実行のたびにfindMedia()の返り値がまちまち」だと「不思議」ですが…。

はい。
同じプログラムなのに、findMedia()の返り値が、まちまちのように思えます。

お礼日時:2006/06/29 14:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!