Ho fatto qualche prova con una implementazione di Printable che ho scritto giusto poco fa.
L'obiettivo che mi sono posto è di stampare una immagine per pagina, usando un algoritmo di scalamento che faccia occupare alla immagine il massimo possibile, ma senza sforare in alcun modo (oltre la area imageable) e mantenendo l'aspect-ratio della immagine.
Indipendentemente dall'aspect-ratio dell'area rispetto all'aspect-ratio della immagine.
codice:public class MultiPagesImagePrintable implements Printable { private final BufferedImage[] images; public MultiPagesImagePrintable(BufferedImage[] images) { this.images = images.clone(); } @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex >= 0 && pageIndex < images.length) { Graphics2D g2d = (Graphics2D) graphics; AffineTransform oldTransform = g2d.getTransform(); try { printImage(g2d, pageFormat, images[pageIndex]); } finally { g2d.setTransform(oldTransform); } return Printable.PAGE_EXISTS; } else { return Printable.NO_SUCH_PAGE; } } private void printImage(Graphics2D g2d, PageFormat pageFormat, BufferedImage image) { int imageWidth = image.getWidth(); int imageHeight = image.getHeight(); double areaX = pageFormat.getImageableX(); double areaY = pageFormat.getImageableY(); double areaWidth = pageFormat.getImageableWidth(); double areaHeight = pageFormat.getImageableHeight(); double scale = Math.min(areaWidth / imageWidth, areaHeight / imageHeight); g2d.translate(areaX, areaY); g2d.scale(scale, scale); g2d.drawImage(image, 0, 0, null); } }

Rispondi quotando
