試みていますが、
下記のように設定すると、印刷できるのですが、
1部しかなぜか印刷できません。3部に設定しても
1部しか印刷できません。
PrintRequestAttributeSet requestAttributes =
new HashPrintRequestAttributeSet();
requestAttributes.add(new Copies(2));
http://www.gihyo.co.jp/magazines/javapress/support/Vol27
の第3章「javax.printによる印刷」で使用されたソースコードを参考にしたりして作成
しているのですが、うまくいきません。
1部でなく、きちんと2部印刷できるように
するにはどうしたらいいでしょうか。
よろしくお願いします。
自分の環境は、
Eclipse3.2
JDK1.5.0_08です。
SamplePrintableMain2.javaをjdk1.5.0_12で試してみましたが、printDialog()の表示前に設定しても部数の情報はクリアされてしまうみたいですね。
job.print()の直前などダイアログを表示した後に設定するときちんと指定された部数で印刷されるようです。
ダイアログで設定した内容と違ってしまうのはちょっと気持ち悪いですけど・・・
Javaのバグ情報のページを参照すればひょっとしたら情報が載っているかもしれません。
http://bugs.sun.com/bugdatabase/index.jsp
余談ですが、こういった場合は動作する形でソースコードを提示しておくと、より適確な回答が得られるのではないかと思います。
残念ながら私の環境ではPDFはサポートされていないらしく、PDFの印刷は試せませんでした(PrintJobFlavorExceptionが発生する)。
ただ、対象ファイルをPNGに変えて、DocFlavorもINPUT_STREAM.PNGに変えたところ(私の環境ではDocFlavor.INPUT_STREAM.AUTOSENSEもうまく動作しなかったので)、指定の通り3部印刷されました。
ひょっとしたら、eimuさんの環境でもAUTOSENSEではなく、DocFlavor.INPUT_STREAM.PDFを指定してあげればよいのかも知れません。
もしくはjob.print()をループで・・・orz
ちなみにjavax.printの印刷ダイアログを表示した場合、部数設定はまだ実装されてないのかdisabledになっていました。
javaの印刷周りはまだまだ弱い気もしますね。
あと、コメント欄も空けておいていただけるとありがたいです。
これは前回書いておくべきでしたね。すみません。
いろいろ調べましたが,
このコードを実行すると、PDFに
どうやら対応していないという事が
WEBを見て感じました。
参考:Java API 実用リファレンス2
サンプルソース
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
class PrintServiceSample
{
public static void main(String[] args)
{
// デフォルトのPrintServiceを検索
PrintService service =
PrintServiceLookup.lookupDefaultPrintService();
// 印刷サービスの名前を表示
System.out.println("Service name : \n " + service.getName());
// サポートする印刷データ形式を表示
DocFlavor[] flabors = service.getSupportedDocFlavors();
System.out.println("Supported flavors : ");
for (int i=0; i < flabors.length; i++) {
System.out.println(" " + flabors[i]);
}
// 印刷ジョブを作成
DocPrintJob job = service.createPrintJob();
}
}
結果:
Service name :
DocuPrint 205
Supported flavors :
image/gif; class="[B"
image/gif; class="java.io.InputStream"
image/gif; class="java.net.URL"
image/jpeg; class="[B"
image/jpeg; class="java.io.InputStream"
image/jpeg; class="java.net.URL"
image/png; class="[B"
image/png; class="java.io.InputStream"
image/png; class="java.net.URL"
application/x-java-jvm-local-objectref; class="java.awt.print.Pageable"
application/x-java-jvm-local-objectref; class="java.awt.print.Printable"
application/octet-stream; class="[B"
application/octet-stream; class="java.net.URL"
application/octet-stream; class="java.io.InputStream"
上記出力にPDFが入っていないので
だめのようです。
私も印刷系はJavaは厳しい感じがします。
何かをインストールする事でPDFを対応させる
ことができるといいのですが。。。
Sunに問い合わせするしかないんですかね、、?
>コメント欄も空けておいていただけるとありがたいです。
ここの箇所はちょっと意味が分かりませんでした,すみません。
明日の時点でとりあえず
回答を終わりにします。
Supported flavorsにPDFが入るようにする
ための方法(ドライバで可能?)は
別途他で質問するようにします。
ソースを提示しておく必要がありましたね、
どうも失礼しました。実行ソースは以下です。
new Copies(3)でやってますが、
1部しか出ないという事です。
Exceptionは特にでません。
印刷ダイアログ出せば、任意で部数を変更
できるのでしょうが、自動で必要部数印刷したいと思っています。
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Locale;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.PrintException;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.JobPriority;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.standard.RequestingUserName;
import javax.print.attribute.standard.MediaSizeName;
class PrintRequestAttributeSetSample
{
public static void main(String[] args)
{
// docフレーバを設定
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
// 印刷要求属性を設定
PrintRequestAttributeSet requestAttributes =
new HashPrintRequestAttributeSet();
requestAttributes.add(new Copies(3));
requestAttributes.add(MediaSizeName.ISO_A4);
// 印刷サービスを検出
PrintService services =
PrintServiceLookup.lookupDefaultPrintService();
// 印刷ジョブを作成
DocPrintJob job = services.createPrintJob();
try {
// docオブジェクトを生成
FileInputStream data = new FileInputStream("print_test2.pdf");
DocAttributeSet docAttributes = new HashDocAttributeSet();
Doc doc = new SimpleDoc(data, flavor, docAttributes);
// 印刷
job.print(doc, requestAttributes);
}
catch (IOException e) {
e.printStackTrace();
}
catch (PrintException e) {
e.printStackTrace();
}
}
}