Java 如何将jasper报告水平拆分为两页

Java 如何将jasper报告水平拆分为两页,java,printing,jasper-reports,Java,Printing,Jasper Reports,我想用A4大小的打印机在jasper上打印一份A2大小的报告。我想把它打印成四幅横向的版画,这样第1页和第2页是A2的顶部,第3页和第4页是A2的底部 ||| |1 | 2 | ||| |-----------..--------+---------| ||| |3 | 4 | || 通常,打印仅打印第1页和第3页的左侧部分。如何打印页面的所有四个部分,每个部分都在自己的页面上事实上,我可以通过以下方式打印(不是最好的质量,但目前对我有效): 首先将jasper报告转换为图像 然后在将图像发

我想用A4大小的打印机在jasper上打印一份A2大小的报告。我想把它打印成四幅横向的版画,这样第1页和第2页是A2的顶部,第3页和第4页是A2的底部

|||
|1 | 2 |
|||
|-----------..--------+---------|
|||
|3 | 4 |
||


通常,打印仅打印第1页和第3页的左侧部分。如何打印页面的所有四个部分,每个部分都在自己的页面上

事实上,我可以通过以下方式打印(不是最好的质量,但目前对我有效):
  • 首先将jasper报告转换为图像
  • 然后在将图像发送到打印机之前,将图像裁剪成打印机纸张大小的片段
  • 并将图像逐个发送到打印机

函数将剪切的图像发送到打印机

private static void printImage(BufferedImage image, PrinterJob printJob) {
    printJob.setPrintable(new Printable() {
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex != 0) {
                return NO_SUCH_PAGE;
            }
            graphics.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
            return PAGE_EXISTS;
        }
    });
    try {
        printJob.print();
    } catch (PrinterException e1) {
        e1.printStackTrace();
    }
}

关于这一点,这里有一个类似的问题,但遗憾的是没有答案如何将水平分割成多个页面。
public static BufferedImage cropImage(BufferedImage src, Rectangle rect) {
    int w = (rect.x + rect.width > src.getWidth()) ? src.getWidth() - rect.x : rect.width;
    int h = (rect.y + rect.height > src.getHeight()) ? src.getHeight()- rect.y : rect.height;
    BufferedImage dest = src.getSubimage(rect.x, rect.y, w, h);
    return dest;
}
private static void printImage(BufferedImage image, PrinterJob printJob) {
    printJob.setPrintable(new Printable() {
        public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
            if (pageIndex != 0) {
                return NO_SUCH_PAGE;
            }
            graphics.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
            return PAGE_EXISTS;
        }
    });
    try {
        printJob.print();
    } catch (PrinterException e1) {
        e1.printStackTrace();
    }
}