Мое приложение позволяет пользователю распечатывать содержимое экрана, состоящее из нескольких элементов управления Swing (изображений, текстов и т. Д.) - печатная панель сама по себе длинная (несколько страниц) и шириной около 600 пикселей.
Поскольку я точно знаю каждый макет страницы (я указал точное количество изображений и компонентов) на каждой странице (общее количество изображений является динамическим), я могу точно рассчитать, сколько страниц мне потребуется для печати.
Я реализовал интерфейс Printable следующим образом:
public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK); //set default foreground color to black
RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
Dimension d = this.getSize(); //get size of document
double panelWidth = d.width; //width in pixels
double panelHeight = d.height; //height in pixels
double pageHeight = pf.getImageableHeight(); //height of printer page
double pageWidth = pf.getImageableWidth(); //width of printer page
double scale = pageHeight / panelHeight;
int totalNumPages = (int) Math.ceil(scale * panelWidth / pageWidth);
if (pageIndex >= totalNumPages) {
return Printable.NO_SUCH_PAGE;
}
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.translate(0f, -pageIndex * pageHeight);
g2.scale(scale, scale);
this.paint(g2);
return Printable.PAGE_EXISTS;
}
Кажется, все работает нормально.
Поскольку у меня нет принтера, я протестировал его на принтере PDF и на принтере нескольких клиентов - и результаты были хорошими.
Однако на одном из принтеров моего пользователя - кажется, что-то не работает с расчетом, поскольку он разрывает страницу в середине изображения.
Есть ли более элегантный способ сделать эти вычисления?
Могу ли я вместо этого добавить куда-нибудь уведомление о разрыве страницы?
Спасибо