2011-01-06 8 views
2

私は、存在するjarファイルと同じフォルダにbarcode.jpgという名前のバーコードイメージを生成するJavaコードを持っています。私はこのJavaを使用してサーマルプリンタを使用してバーコードイメージを連続的に再印刷する

Image bcode = Toolkit.getDefaultToolkit().getImage("barcode.jpg"); 
if (bcode != null) { 
    oTokenPrinter.setTokenParameters(strTokenNumber, bcode); 
} 
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
aset.add(OrientationRequested.PORTRAIT); 
aset.add(new MediaPrintableArea((float) 16.0, (float) 20.5, (float) 184.0, (float) 228.5, 1000)); 
System.out.println(aset); 
PrinterJob oJob = PrinterJob.getPrinterJob(); 
PageFormat pf = oJob.defaultPage(); 
oJob.setPrintable(oTokenPrinter, pf); 
System.out.println(aset); 
System.out.println("Printing Started...\n"); 


try { 
    oJob.print(aset); 
} catch (PrinterException ex) { 
    Logger.getLogger(EntryHandler.class.getName()).log(Level.SEVERE, null, ex); 
} 

setTokenParameters関数は

public void setTokenParameters(String strTokenId, Image barcode) { 
    strTokenID = strTokenId; 
    BarcodeImage = barcode; 
} 

であり、これはプリント()メソッドが含まれている同じクラスに存在行います。

public int print(Graphics g, PageFormat pf, int iPage) throws 
     PrinterException { 
    if (iPage > 0) { 
     return NO_SUCH_PAGE; 
    } 

    /* User (0,0) is typically outside the imageable area, so we must 
    * translate by the X and Y values in the PageFormat to avoid clipping 
    */ 
    Graphics2D g2d = (Graphics2D) g; 

    g2d.translate(pf.getImageableX(), pf.getImageableY()); 


    /* Now we perform our rendering */ 


    g.setFont(new Font("Arial", Font.BOLD, 10)); 

    /*Printing Begins*/ 

    if (BarcodeImage != null) { 
     System.out.println("Started Printing...\n"); 

     g.drawImage(BarcodeImage, 16, -10, 130, 60, null); 
     g.drawString("Token ID: " + strTokenID, 18, 60); 
     g.dispose(); 
     System.out.println("Finished Printing"); 

    } else { 

     System.out.print("Image not loaded"); 

    } 
    /*Finished Printing.*/ 

    /* tell the caller that this page is part of the printed document */ 
    return PAGE_EXISTS; 
} 

これは私が行うことです。画像の生成はスレッド内にあり、上書きを続け、画像を開くとその画像を見ることができます。しかし、問題は、印刷中に同じ画像を印刷し続けることです。毎回イメージのみが同じであり、トークンIDは変化し続ける。

この問題の解決方法私は印刷後毎回イメージを削除しようとしました。しかし、それは動作しません。私はまた、私のJavaプログラムを通して.batファイルを実行してプリンタスプーラをクリアしようとしました。役立たず。

注記:これは、プリンタがサーマルプリンタの場合にのみ発生します。私は普通のHP LaserJetを試してみましたが、正常に動作します。しかし問題はA4シートを無駄にしなければならないということです。私はサーマルプリンタで領収書のサイズでこのことが必要です。

+0

タスクを簡略化しようとしましたか?例えば、 "hello、world"を同じプリンタに印刷することができます。プリンターのバッファーサイズの問題ですか? – AlexR

+0

私が言ったように、私はそれらが変化していても、どんな文字列でも印刷することができます....イメージの傷つきは常にその最初のイメージです...そして、このことはHP laserjetで動作することにも注意してください...サーマルプリンタだけではこれは動作しません.... – tattu

+0

また、画像は正しく再生されています...もし私がbarcode.jpgを開いて新しいものをプレビューしていても.... ..プリンタがどこで最初のものを保持しているかわからない... – tattu

答えて

0

プリンタのような音が画像をキャッシュしています。おそらく毎回イメージ名に乱数を追加してみてください。

編集:

Toolkit.getDefaultToolkit().getImage("barcode.jpg"); 

ツールキットが画像をキャッシュするのではなく、それをリロードされる:

別の可能性は、ラインにすることです。

編集2:

のgetImageのJavadocから:

その形式 GIF、JPEGまたはPNGのいずれかになります指定されたファイルからピクセルデータ を取得するイメージを返します。 の基本ツールキットは、返された同じImageに というファイル名を持つ複数の要求を で解決しようとします。 に必要なメカニズムが、この画像の共有を容易にするので が オブジェクトはもはやの 無期限に使用されている 画像上に保持し続けることが、 開発者は を用いて画像の 自分のキャッシュを実装することをお勧めしますcreateImageバリアントは が利用可能です。

私には画像のキャッシュのように聞こえますが、代わりにcreateImage()を使ってみましたか?

+0

ええ、私は同じことを試みた...私は現在の時間で画像の名前を変更し続けた。現時点では、画像のまた、印刷後も同じことを削除しました。だから毎回新しい画像が名前として現在の時刻で生成され、印刷後に削除されます。しかし、役に立たない。 – tattu

+0

私が言ったように、私はまた、スプーラをクリアして再起動するためのプログラムを通してバットファイルを実行しました。しかし、再び変化はありません。 – tattu

+0

Iveが編集しました - イメージをキャッシュするツールキットはありますか? (ただし、すべてのプリンタで問題が発生していたとしても...) – PaulJWilliams

関連する問題