我正在使用 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);
}
}
现在这段代码产生了两个打印件,在大多数打印机上都打印了从纸的左上角到纸中间的一条线。然而,在上述打印机上,第一次打印会在整张纸上产生一条粗线(200% 比例)——然而,即使在 Minolta 打印机上,第二个变体也可以。
似乎是一个 Java 错误,因为所有其他程序都可以使用打印机正常打印。该错误已被 Sun 接受,但由于无法使用正确的打印机而关闭(https://bugs.openjdk.java.net/browse/JDK-804159)