无边距打印

我正在尝试写一个photobooth程序,但我很难做出无边框打印。 我很近,但图像没有填充4“x 6”打印。 我会很感激有关实现无边框打印的任何提示。

干杯!

final BufferedImage img = ImageIO.read(new File(image)); // Assuming that images are going to be 300 DPI PrinterResolution pr = new PrinterResolution(300, 300, PrinterResolution.DPI); PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); pras.add(pr); // Set print job so the image name shows (in the print queue) this.pj.setJobName(new File(image).getName()); PageFormat pf = this.pj.getPageFormat(null); Paper paper = pf.getPaper(); paper.setSize(4 * 72, 6 * 72); paper.setImageableArea( 0.0, 0.0, paper.getWidth(), paper.getHeight() ); if(img.getWidth(null) > img.getHeight(null)) pf.setOrientation(PageFormat.LANDSCAPE); else pf.setOrientation(PageFormat.PORTRAIT); pf.setPaper(paper); // Create the page this.pj.setPrintable(new Printable() { public int print(Graphics g, PageFormat pf, int i) throws PrinterException { if (i != 0) return NO_SUCH_PAGE; double width = img.getWidth(null); double height = img.getHeight(null); double w = Math.floor(pf.getImageableWidth() - pf.getImageableX()) / (width * 1.0); double h = Math.floor(pf.getImageableHeight() - pf.getImageableY()) / (height * 1.0); double scale = Math.min(w, h); Graphics2D g2 = (Graphics2D) g; g2.translate(0, 0); g2.scale(scale, scale); g2.drawImage(img, 0, 0, (int)width, (int)height, null); return PAGE_EXISTS; } }, this.pj.validatePage(pf)); // Get number of copies int nCopies = SetPrintQuantity.getPrintQuantity(new File(image)); // Print if(nCopies != 0) for(int i = 0; i < nCopies; i++) this.pj.print(pras); System.out.println(nCopies + ((nCopies == 1) ? " copy" : " copies")); 

this.pj = PrinterJob

我一直在和同样的问题打架一段时间。 这是我的解决方案:

确定打印机的实际页面大小:

 final PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintService(ps); final PageFormat pf = printJob.defaultPage(); System.out.println("Printer Page width=" + pf.getWidth() + " height=" + pf.getHeight()); 

对于带有4“x6”纸张的HiTi P720L照片打印机,它实际上是4.133“x6.147”。

创建并设置具有完整页面大小和完整可成像区域的新Paper对象:

 final Paper paper = new Paper(); paper.setSize(pageWidth * 72.0f, pageHeight * 72.0f); paper.setImageableArea(0.0, 0.0, paper.getWidth(), paper.getHeight()); pf.setPaper(paper); 

然后是最后的技巧,绘制到范围之外的x / y坐标。 在我的情况下,我必须将x坐标缩放10%并将x坐标转换为-55(将其置于负x值)。

 printJob.setPrintable(new Printable() { public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { Graphics2D g2 = (Graphics2D) graphics; final double xScale = 1.1; final double xTranslate = -55; final double yScale = 1; final double yTranslate = 0; final double widthScale = (pageFormat.getWidth() / image.getWidth()) * xScale; final double heightScale = (pageFormat.getHeight() / image.getHeight()) * yScale; System.out.println("Setting scale to " + widthScale + "x" + heightScale); final AffineTransform at = AffineTransform.getScaleInstance(widthScale, heightScale); System.out.println("Setting translate to " + xTranslate + "x" + yTranslate); at.translate(xTranslate, yTranslate); if (pageIndex != 0) { return NO_SUCH_PAGE; } g2.drawRenderedImage(image, at); return PAGE_EXISTS; } }, pf);