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);
    }
}

现在这段代码产生了两个打印件,在大多数打印机上都打印了从纸的左上角到纸中间的一条线。然而,在上述打印机上,第一次打印会在整张纸上产生一条粗线(200% 比例)——然而,即使在 Minolta 打印机上,第二个变体也可以。

似乎是一个 Java 错误,因为所有其他程序都可以使用打印机正常打印。该错误已被 Sun 接受,但由于无法使用正确的打印机而关闭(https://bugs.openjdk.java.net/browse/JDK-804159

4

2 回答 2

0

你的平台是windows/mac/linux吗?

当打印作业的媒体提示未与驱动程序完全通信时,我在使用标签打印机打印时遇到了问题。它实际上与您的问题非常相似,拉伸打印,跳页等。

我不知道您是否有要修改的代码,但我们不得不切换到系统打印而不是 Java 打印。然后使用系统打印设置(在我的情况下是 windows spooler),我必须创建一个具有正确打印所需的确切驱动程序设置的打印机。除了指定宽度/高度/方向之外,您很少能在 JasperReports 中真正做任何事情。

我假设您的报告在保存为 PDF 时打印良好,然后从 PDF 查看器打印。

于 2013-07-20T20:34:27.307 回答
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 回答