Печать нескольких страниц является легкой частью вашего вопроса.
Используйте java.awt.print.Book.
Это можно сделать так:
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setJobName(this.language.translate("printCharacter"));
Book pBook = new Book();
pBook.append((graphics, pageFormat, pageNum) -> {
graphics.setColor(Color.RED);
graphics.fillRect(50, 50, 100, 100);
return Printable.PAGE_EXISTS;
},
printerJob.defaultPage()
);
pBook.append(
(graphics, pageFormat, pageNum) -> {
graphics.setColor(Color.BLUE);
graphics.fillRect(50, 50, 100, 100);
return Printable.PAGE_EXISTS;
},
printerJob.defaultPage()
);
printerJob.setPageable(pBook);
if (!printerJob.printDialog()) {
return;
}
try {
printerJob.print();
} catch (PrinterException ex) {
// handle exception
}
(То есть каждую из ламд по-прежнему называют 2 раза, я также не уверен, почему это так).
Для вашей проблемы печати:
Пока что я не нашел (простого) решения, но основная причина, по-видимому, в том, что ваш макет просто не переносится при печати графического компонента.
В основном все на странице, но заканчивается в позиции 0,0 (верхний левый угол).
Возможно, вам придется переделать макет, используя правильные координаты, или (что более вероятно) выяснить, почему макет не работает.
Edit:
Я нашел класс Java, который может захватывать изображения компонентов,
см https://tips4java.wordpress.com/2008/10/13/screen-image/
Кажется, есть некоторые общие проблемы при попытке использовать метод рисования JComponent, который не был визуализирован до / создан на лету без отображения.
С классом, представленным в Link, он работает, но масштабирование все еще требует некоторой работы.
Book pBook = new Book();
pBook.append((graphics, pageFormat, pageNum) -> {
Graphics2D graphics2D = (Graphics2D) graphics;
graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
PrintBase page = new General(this.getActiveCharacter(), false);
Dimension dimension = new Dimension((int) pageFormat.getWidth(), (int) pageFormat.getHeight());
page.setSize(dimension);
page.create();
BufferedImage image = ScreenImage.createImage(page);
graphics2D.drawImage(image,new AffineTransform(1f,0f,0f,1f,0,0), null);
return Printable.PAGE_EXISTS;
}, printerJob.defaultPage());