4

レポートを Java デスクトップ アプリケーションからドット マトリックス プリンター (Epson LX-300 II) に印刷する必要があります。レポートは、テキストと一部のグラフィックで構成されます。プリンターはUSB経由で接続されており、CUPSを使用して印刷しています。Printable インターフェイス (Java ではかなり標準) を使用して印刷しています。

私の問題:

テキストの印刷品質は、すべてのプリンター解像度 (60x60、120x60、120x72) で非常に低くなります。一部のプリンター ドライバーでは、フォント ヒンティングがまったくないようです。文字は非常に醜く見えます。同じページにグラフィックスも印刷する必要があるため、ポートに直接テキスト出力を使用することはできません (見栄えは良いです)。

同じアプリケーションが高品質のテキストとグラフィックスを Windows で印刷するため、問題は Java ではないようです。また、問題は CUPS システムにはないようです。これは、OpenOffice または Abiword が同じテキストを同じフォントで非常に高品質 (Windows よりも悪いが、それでも良い) で印刷するためです。

また、問題はフォントにはありません。Windows の Tahoma フォントを試してみましたが、同じです。Java/Linux で印刷すると品質が低下します。

問題は X.Org の BCI ヒンティングではなく、画面に表示すると見栄えがします。

ドキュメントを OpenOffice から PDF にエクスポートしてその PDF を印刷すると、同じ結果が得られました。同じ文書が Office から印刷されていれば、すべて問題ありません。

さまざまな Linux (KUbuntu 10.04、Puppy 2、Puppy 4.3.1) を試しましたが、どの Linux でも同じ結果が得られました。

問題は Ghostscript にあるのかもしれません。私は Puppy で 9.x バージョンを取得しましたが、それでも同じです。または、CUPS ラスタライザー (「rastertoepson」または「foomatic-rip」) に問題がある可能性もあると思います。

出力の例です(「モバイル」品質の写真で申し訳ありません):

ここに画像の説明を入力

何が起こっているのかさっぱりわかりません、助けてください。

-- PS 私の最終的な解決策は、「ESCPrinter.java」オープンソース クラスを使用して、エプソンのドキュメントに従って画像を印刷する機能を追加することです。

4

3 に答える 3

1

試してみることができsetRenderingHintます。簡単に入力できるように、いくつかの呼び出しを一緒にコピーしました。多分それは TEXT_ANTIALIASING ですが、他のものを除外するつもりはありません。

別のアイデアは、どこかで画面解像度が印刷解像度にスケーリングされることです。日曜大工の印刷を備えた小さなJavaアプリがそれを示します。

していませんrotateよね?(写真を見ただけです)。

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    Graphics2D g = (Graphics2D) graphics;
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
    g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT);
    g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
    return Printable.PAGE_EXISTS;
}
于 2012-01-28T04:20:24.580 に答える
0

私の経験からすると、これはフォントが Java によって認識されず、デフォルトで他の標準フォントになっていることが原因である可能性があります。

$JAVA_HOME/jre/lib/fontttf ファイルをディレクトリに配置する必要があります。

おそらく、Java フォント物理フォントに関するこれらの記事が役立つかもしれません。

于 2012-01-23T13:27:51.297 に答える
0

[ tl;dr: 事実上不可能です。別のプリンターを使用するか、テキスト モードに切り替えます。]

ドットマトリックス プリンタ、特に 9 ピン プリンタ (エプソンの LX シリーズなど) は、多かれ少なかれテキスト印刷に最適化されています。グラフィックスを印刷すること可能ですが、その解像度は非常に低く、今日の標準的なプリンターよりもはるかに低くなっています。過去には、印刷物から最大の忠実度を得るなど、出力を最適化する必要がありました。これらのプリンタでグラフィック モードでテキストを印刷しようとした人は、まともな人なら誰もいないでしょう。プリンタの組み込みフォントは読みやすさのために最適化されていますが、ラスタライズがプリンタの特殊性に関係なくプリンタ ドライバによって行われると、結果は最適ではなくなります。

エプソンの LX シリーズなどの 9 ピン プリンタの解像度は、これには低すぎます。テキスト モードで印刷しない限り (レポート アプリケーションを自分で作成していない場合、これはほとんど不可能です)、より良い結果は得られません。24 ピン プリンタには十分な印刷出力を得るのに十分な「予備」がありますが、9 ピン プリンタはすでに限界に達しています。

フォントヒンティングなどでどんなトリックを行っても、本当に大きなフォントを使用しない限り(フォントがプリンターの低解像度を相殺するのに十分な大きさである場合)、別のプリンターを使用する以外にできることはありません. 問題は、プリンターの物理的な制限に適合できないラスター化です。

(ドットマトリックスプリンターでレポートを作成する「正しい」方法は、太字や下線などのさまざまな ESC/P 書式設定コマンドを利用して、可能な限り「純粋な」テキストとして印刷することです。グラフィックが必要な場合は、は、その特定のグラフィックのグラフィック モードに入り、テキスト モードで続行します. プリンタの組み込みフォントは、プリンタの動作方法の制限を考慮して、できるだけ読みやすいように最適化されていますが、独自のフォントを定義することもできます. )

これは経験によるものです。私はまだ 9 ピンといくつかの 24 ピン プリンタ (すべて Epsons) を所有しており、ほとんどをテキスト モードで使用しています。私は 24 ピン プリンタを一般的な Windows (または何でも) プリンタとして使用できます (実際に使用します) が、9 ピン プリンタではこれは実際には実行不可能です。しかし、少し考えれば、より「最新の」プリンタではさらに多くの作業が必要な、非常に優れた結果を得ることができます。

于 2013-12-22T00:00:19.397 に答える