- PR -

Javaでの印刷について

1
投稿者投稿内容
ひよこ
会議室デビュー日: 2003/03/13
投稿数: 3
投稿日時: 2003-03-13 16:13
はじめまして。こんにちわ。

現在、A3サイズ以上の400dpiの画像ファイルを
A4サイズに縮小して印刷を行っているのですが、うまく印刷が行えなくて悩んでいます。

印刷を行う為に以下の事をやってみました。

@PrintableのPrintを実装してdrawImageで印刷
→A3サイズ以上400dpiの画像の場合「OutOfMemory」のエラーが発生
A4サイズ300dpiの画像なら印刷できる。

APrintJobでdrawImageでの印刷
→A3サイズ以上400dpiの画像の場合、画像が壊れて印刷される。

B-Xmxでメモリを増やしてPrintJobでdrawImageでの印刷
→A3サイズ以上400dpiの画像の場合、画像が壊れて印刷される。

CPrintableのPrintを実装し、getScaledInstanceで画像ファイルを縮小し
画像データを分割しながらdrawImageで印刷
→A3サイズ以上400dpiの画像で印刷が行えるが、画像がはっきりと印刷されない。

開発環境はJDK1.3です。

どなたか画像ファイルをはっきりと印刷する方法や画像ファイルが壊れずに
印刷できる方法や知恵がありましたらお教え下さい。
よろしくお願い致します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-03-13 16:26
unibon です。こんにちわ。

引用:

ひよこさんの書き込み (2003-03-13 16:13) より:
開発環境はJDK1.3です。

どなたか画像ファイルをはっきりと印刷する方法や画像ファイルが壊れずに
印刷できる方法や知恵がありましたらお教え下さい。


#いわゆる丸付き数字は機種依存文字なので使わないようにご留意ください。

JDK 1.3 の印刷関係は、いろいろバグがあるので、
1.4 で試されることを強くお勧めします。
もちろん、1.4 でもバグはあるとは思いますが、
少なくとも自分のクラスの問題か、
JDK のライブラリのクラスの問題かの切り分けるために、
もっとも手っ取り早いのは JDK のバージョンを変えることだからです。

なお、OutOfMemoryError が出る場合は、
どこで出るかを特定されると良いと思います。
OutOfMemoryError のエラーの場合は、
通常はスタックトレースが出力されませんが、
つぎのようにするとスタックトレースを見ることができます
(これに限らないのかもしれませんが、私の経験を書きます)。
(1) JDK 1.3 の場合だけですが Java の VM の起動オプションに -classic を付ける。
(2) Eclipse のデバッガ上で動かす。

なお、そもそも大量のメモリを使う場合は、
あらかじめ Java VM の起動時にメモリオプションを付ける必要がありますが、
付けられているでしょうか。
Java -Xmx256m
などのように指定します(256MB の指定の例)。

#以下、後から追加しました。

たとえ JDK 1.3 のままであっても
http://java.sun.com/j2se/1.3/ja/
にある最新の 1.3.1_07 ならば印刷関係のバグはかなり解消しているので、
もしこのバージョンをまだ試されていないならば試されるとよいでしょう。

[ メッセージ編集済み 編集者: unibon 編集日時 2003-03-13 16:34 ]
ひよこ
会議室デビュー日: 2003/03/13
投稿数: 3
投稿日時: 2003-03-13 18:17
アドバイスありがとうございます。

> JDK 1.3 の印刷関係は、いろいろバグがあるので、
> 1.4 で試されることを強くお勧めします。
> もちろん、1.4 でもバグはあるとは思いますが、
> 少なくとも自分のクラスの問題か、
> JDK のライブラリのクラスの問題かの切り分けるために、
> もっとも手っ取り早いのは JDK のバージョンを変えることだからです。

JDK1.4の環境でも動作の確認は行いました。
1.4の環境では正常に印刷が行えました。
となると1.4にするしかこの現象は回避できないということになるでしょうか?


> なお、そもそも大量のメモリを使う場合は、
> あらかじめ Java VM の起動時にメモリオプションを付ける必要がありますが、
> 付けられているでしょうか。
> Java -Xmx256m
> などのように指定します(256MB の指定の例)。

メモリオプションの方法も試しましたが、画像ファイルが壊れて印刷されました。


> たとえ JDK 1.3 のままであっても
> http://java.sun.com/j2se/1.3/ja/
> にある最新の 1.3.1_07 ならば印刷関係のバグはかなり解消しているので、
> もしこのバージョンをまだ試されていないならば試されるとよいでしょう。

現在使用してるバージョンは1.3.1_04ですが、
1.3の最新環境1.3.1_07でも現象は起りました。
この場合JDK1.4に上げるしか方法はないのでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-03-14 10:06
unibon です。こんにちわ。

引用:

ひよこさんの書き込み (2003-03-13 18:17) より:
現在使用してるバージョンは1.3.1_04ですが、
1.3の最新環境1.3.1_07でも現象は起りました。
この場合JDK1.4に上げるしか方法はないのでしょうか?


基本的にはそれしかないと思います(あとは次期の 1.3.1_08 で直ることを祈るとか)。

#以下は、なんとか現状でやりくりするための案にすぎませんが。

> (1)PrintableのPrintを実装してdrawImageで印刷
> →A3サイズ以上400dpiの画像の場合「OutOfMemory」のエラーが発生
> A4サイズ300dpiの画像なら印刷できる。

この場合に -Xmx でメモリを増やしてもダメなのでしょうか、という疑問があります。
また、どこでこのエラーが発生しているのでしょうか。

>
> (2)PrintJobでdrawImageでの印刷
> →A3サイズ以上400dpiの画像の場合、画像が壊れて印刷される。
>
> (3)-Xmxでメモリを増やしてPrintJobでdrawImageでの印刷
> →A3サイズ以上400dpiの画像の場合、画像が壊れて印刷される。

「画像が壊れて」とは、具体的にはどのような壊れ方・乱れ方なのでしょうか。
私の経験では、縦線が斜め45度に傾くように乱れる現象が起きることがあり、
その場合は、用紙の大きさを変えるだけでも回避できる場合もありました
(モノは言いようですね。用紙の大きさを変えると発生する場合もありました。)。

なお、Java はプリンタドライバはあくまでも OS のものを使いますので、
OS の種類や、プリンタドライバの種類にも依存することがあります。
Windows だと、Windows 95/98/Me か Windows NT/2000/XP のどちらの系統かで、
現象が違うことがあります(プリンタドライバのアーキテクチャが異なるので)。
あと、プリンタが PostScript を受け付けるかそうでないかでも、かなり違うようです。
また、プリンタ関連は Java のランタイムの実装にも依存しているようであり、
Sun の JDK とたとえば IBM の JDK では実装が異なったため、
IBM の JDK だと現象が出ないかもしれません(だからといってどうなるものでもないですが)。

> (4)PrintableのPrintを実装し、getScaledInstanceで画像ファイルを縮小し
> 画像データを分割しながらdrawImageで印刷
> →A3サイズ以上400dpiの画像で印刷が行えるが、画像がはっきりと印刷されない。

「はっきりと印刷されない」とはどんな見え方でしょうか。(理論値よりも解像度が荒くなる?)


なお、いずれにしても、再現するコードを提示されると、
なにか、API の呼び方を変えて回避する案が出てくるかもしれません。
ひよこ
会議室デビュー日: 2003/03/13
投稿数: 3
投稿日時: 2003-03-14 21:22
unibon様ありがとうございました。
画像が壊れずに印刷ができました。

> > (1)PrintableのPrintを実装してdrawImageで印刷
> > →A3サイズ以上400dpiの画像の場合「OutOfMemory」のエラーが発生
> > A4サイズ300dpiの画像なら印刷できる。
> この場合に -Xmx でメモリを増やしてもダメなのでしょうか、という疑問があります。
> また、どこでこのエラーが発生しているのでしょうか。

PrintableのPrintの実装はアプレットで行っていたので、
フレームで実装を行いVMのオプションを付けました。
A3サイズ以上の画像に対しては-Xmx512mくらいの指定が必要になりました。

本当にありがとうございました。
1

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