0

JasperReports を使用して Java アプリケーションから印刷しています。かなり長い間、すべての印刷物はすべての顧客にとって問題ありませんでしたが、最近、コニカミノルタ PagePro 1200 または 1350W プリンターを使用している数人の顧客のためにソフトウェアをインストールしました. そして、それらのすべての顧客は同じ結果を得ます - 印刷は「引き伸ばされます」 - あたかも私がA5用紙にA4レポートを印刷したかのように. A4 で A4 を印刷していることを除いて、他のすべてのプリンターでは問題なく動作します。

何が原因なのか誰にもわかりませんか?

この質問はhttps://stackoverflow.com/questions/15854722/jasper-report-printing-stretchedに似ているようですが、そこに示されている回避策 (プリンターの用紙サイズをいじるなど) では、望ましい結果が得られませんでした。

以下は印刷例です。

印刷例

そして、これは印刷物がどのように見えるかです(わずかに異なるデータがありますが、問題は明らかだと思います)

ご希望のプリント

提案をありがとう。

編集:

この問題は、印刷 API を直接呼び出すだけで再現できます。

import java.awt.*;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

/**
 *
 * @author MaCe
 */
public class PrintTest {

    static Printable printable = new Printable() {
        @Override
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            Graphics2D grx = (Graphics2D)graphics;
            grx.drawLine(20,20, getPageWidth() / 2, 20);
            return Printable.PAGE_EXISTS;
        }

    };
    protected static int getPageWidth() {
        //width of A4 in 1/72 of inches
        return 595;
    }

    protected static int getPageHeight() {
        //height of A4 in 1/72 of inches
        return 842;
    }

    public static void main(String args[]) throws PrinterException {
        Frame f = new Frame();
        f.show();

        //Build a buggy print job using PrinterJob class
        PrinterJob printJob = PrinterJob.getPrinterJob();

        /**
     * Fix for bug ID 6255588 from Sun bug database
     */
        try {
            printJob.setPrintService(printJob.getPrintService());
        } catch (PrinterException e) {
        }

        PageFormat pageFormat = printJob.defaultPage();
        Paper paper = pageFormat.getPaper();

        printJob.setJobName("Buggy output");

        pageFormat.setOrientation(PageFormat.PORTRAIT);
        paper.setSize(getPageWidth() , getPageHeight());
        paper.setImageableArea(
                0,
                0, getPageWidth(), getPageHeight());

        pageFormat.setPaper(paper);

        Book book = new Book();
        book.append(printable, pageFormat, 1);
        printJob.setPageable(book);

        if (printJob.printDialog()) {
            printJob.print();
        }

        //Build a good print job using PrintJob class
        PrintJob pjob = f.getToolkit().getPrintJob(f, "Good output", null);
        if (pjob!=null) {
            Graphics g = pjob.getGraphics();
            g.drawLine(20, 20, pjob.getPageDimension().width / 2, 20);
            pjob.end();
        }

        System.exit(0);
    }
}

このコードは、ほとんどのプリンタで紙の左上隅から紙の中央まで線を印刷する 2 つの印刷物を作成します。ただし、前述のプリンターでは、最初の印刷では紙全体に太い線が作成されます (200% スケール)。2 番目のバリアントは、ミノルタのプリンターでも問題ありません。

他のすべてのプログラムはプリンタで正常に印刷されるため、Java のバグのようです。このバグは Sun によって受け入れられましたが、正しいプリンターを入手できなかったためクローズされました ( https://bugs.openjdk.java.net/browse/JDK-804159 ) 。

4

2 に答える 2

0

問題の回避策を見つけました。解決策は、印刷する前にグラフィックスを半分に縮小することです。グラフィックス オブジェクトはどこにも公開されていないため、JasperReports でこれを行うのは簡単ではありません。ただし、私のアプリは @AspectJ を使用しているため、カスタム アスペクトを介してグラフィックをいじることができました。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;


@Aspect
public class JRMinoltaAspect {        

    @Before("execution(int net.sf.jasperreports.engine.print.JRPrinterAWT.print(java.awt.Graphics, java.awt.print.PageFormat , int )) && args(g, pf, ..)")
    public void scalePrint(Graphics g, PageFormat pf){
        if(pf.getOrientation() == PageFormat.LANDSCAPE){
            g.translate(0, (int)pf.getHeight() / 2 );
        }
        ((Graphics2D)g).scale(0.5, 0.5);        
    }

}
于 2013-08-07T12:18:30.253 に答える
0

プラットフォームは windows/mac/linux ですか?

印刷ジョブのメディア ヒントがドライバーに完全に伝達されない場合、ラベル プリンターでの印刷に問題がありました。実際には、印刷が引き伸ばされたり、ページがスキップされたりするなど、問題と非常によく似ています。

変更するコードがあるかどうかはわかりませんが、Java 印刷ではなくシステム印刷に切り替える必要がありました。次に、システム印刷設定 (私の場合は Windows スプーラー) を使用して、適切に印刷するために必要な正確なドライバー設定でプリンターを作成する必要がありました。幅/高さ/方向を指定する以外に、JasperReports で実際にできることはめったにありません。

レポートを PDF に保存すると正常に印刷され、PDF ビューアーから印刷できると思います。

于 2013-07-20T20:34:27.307 に答える