- PR -

Javaアプリからのプリントアウトについて

1
投稿者投稿内容
Bob
会議室デビュー日: 2006/11/28
投稿数: 16
投稿日時: 2008-03-12 12:06
お世話になっております。

現在、Javaでマシンに繋がっているプリンタ名を取得してその中から
プリンタを選択して自動印刷できる機能を作成しています。
そこで、今問題になっているのが、拡張子がPNGなどのイメージファ
イルであれば印刷可能なのですが、テキストやPDFファイルでは印刷
ができずエラーとなることです。

以下のソースで実行しております。
Javaのバージョンは 1.4.2 です。
-- 以下ソースです --
try{
// テキストファイルを指定↓
FileInputStream stream = new FileInputStream(filename);
// 利用可能なプリンタの件数
System.out.println("Service count: "+pServices.length);
// プリンタ名格納変数
String[] cPrinter = new String[pServices.length];
DocPrintJob job = null;
for (int i = 0; i < pServices.length; i++) {
tName = pServices[i].getName();
System.out.println("Printer: "+tName);

// 一番最初に取得したプリンタで印刷
if(i == 0){
// 印刷データの DocPrintJob への提供形式を指定
DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCII;
Doc doc = new SimpleDoc(stream, flavor, null);
// プリントジョブの作成
job = pServices[i].createPrintJob();
// 印刷開始
job.print(doc, null);
break;
}
cPrinter[i] = tName;
}
System.out.println("終了");
} catch (FileNotFoundException ex) {
ex.printStackTrace();
return;
} catch (PrintException ex) {
ex.printStackTrace();
}

---------------
実行すると以下のExceptionが発生します。
sun.print.PrintJobFlavorException: invalid flavor
at sun.print.Win32PrintJob.print(Win32PrintJob.java:296)
at SimplePrint.main(SimplePrint.java:43)

おそらくDocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCIIの指定の
問題だと思うのですが、TXT、PDFに関しては何を指定しても上記
エラーとなります。

すみませんがご教授願います。
以上、宜しくお願いいたします。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-03-12 13:07
DocFlavor.INPUT_STREAM.PDF
DocFlavor.INPUT_STREAM.TEXT_PLAIN_HOST

ってのがありましたが、これでどうですか。
TEXT_xxxxxxxは、他にもいろいろありますよ。

つか、DocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCIIだったら、
複数のイメージファイルで通っちゃうの?
中の人もたいへんだね。
Bob
会議室デビュー日: 2006/11/28
投稿数: 16
投稿日時: 2008-03-12 13:31
返答有難うございます。

教えていただいたとおり
PDFの場合、DocFlavor.INPUT_STREAM.PDF
TXTの場合、DocFlavor.INPUT_STREAM.TEXT_PLAIN_XXX
を指定して試していたのですが、うまくいきませんで
した。
同じようにPrintJobFlavorExceptionが発生します。

もう少し頑張ってみます。
どうも有難うございました。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-03-12 13:46
こんなのを見つけました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1156&forum=12&2

そりゃそうか。
PDFはもちろんですが、
プレーンテキストだって、レイアウトエンジンが必要ですしね。

・PDFの場合
私はiTextは詳しくないですが、iTextの機能を使用
<削除>
するか、あるいはPrinterJobに流し込めるStreamを取得するか、

「invalid flavor」が相手じゃ意味無いですね。orz
</削除>
できませんかね。

・テキストの場合
自分でレイアウトエンジンを用意する。
具体的には、ImageBufferを用意して、Graphicsを取得して、
テキストを配置してPrinterJobに流し込む。

私が思いつくのはこんなところです。

[ メッセージ編集済み 編集者: Edosson 編集日時 2008-03-12 13:52 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-03-12 14:01
http://yggdrasil.exblog.jp/865940/

こんなのも。
DocFlavorのタイプって、プリンタに依存しているんですね。
勉強させていただきました。
Bob
会議室デビュー日: 2006/11/28
投稿数: 16
投稿日時: 2008-03-12 15:53
回答どうも有難うございました。

プリンタに依存するのであればJavaのPrint機能は使用しないほうが
いいかもしれませんね。

何か他の方法を検討しようかと思います。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-03-12 16:29
環境が整っていないと、javax.printは使えませんが、
java.awt.printなら、どこでも使えるはずですよ。

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/awt/print/Printable.html#print(java.awt.Graphics,%20java.awt.print.PageFormat,%20int)
このメソッドをオーバーライドすればいいです。
Printableは、そのままPrinterJobに放り込めますし。

ただし、Graphicsにデータを書き込むのは、全部自分でやらなければなりません。
PDFは、iTextからページ指定でストリームが取得できるなら、楽かもしれません。
Bob
会議室デビュー日: 2006/11/28
投稿数: 16
投稿日時: 2008-03-13 09:12
いろいろと参考になるご意見、有難うございました。

検討してみようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)