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 ) 。