java PrinterJob不打印以适合纸张

当使用默认打印机打印jpeg文件时,我目前卡住了。 在我的程序中,当我从文件夹中选择图像时,我需要使用打印机默认设置(纸张尺寸,边距,方向)进行打印。

目前我得到了这个:

PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); final BufferedImage image = ImageIO.read(new File("car.jpg")); PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintService(printService); printJob.setPrintable(new Printable(){ @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException{ if (pageIndex == 0) { graphics.drawImage(image, 0, 0, (int)pageFormat.getWidth(), (int)pageFormat.getHeight(), null); return PAGE_EXISTS; else return NO_SUCH_PAGE; } } printJob.print(); 

我现在打印机尺寸的默认设置是:10 x 15厘米(4 x 6英寸)但是当我设置程序打印给定图像时,它只显示纸张的一小部分。

请帮帮我。

编辑

感谢大家的帮助,我设法找到了另一位用户在Borderless打印时发布的答案

确保您首先翻译Graphics上下文以适应可想象区域…

 g2d.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY()); 

接下来,确保使用PageFormatimageableWidthPageFormat

 double width = pageFormat.getImageableWidth(); double height = pageFormat.getImageableHeight(); 

而不是width / height属性。 许多这些东西都是从不同的背景下翻译出来的……

 graphics.drawImage(image, 0, 0, (int)width, (int)height, null); 

getImageableWidth/Height返回页面方向上下文中的页面大小

打印几乎假设dpi为72(不要压力,打印API可以处理更高的分辨率,但核心API假设为72dpi)

这意味着10x15cm的页面应转换为283.46456664x425.19684996像素。 您可以使用System.out.printlnvalidation此信息,并将getImageableWidth/Height的结果转储到控制台。

如果您获得不同的设置,Java可能会覆盖默认页面属性

例如…

  • 使图像适合打印区域
  • 设置jLabel的打印尺寸并在打印件上放置jRadiobutton

你有两个选择……

你可以…

显示PrintDialog并确保选择了正确的页面设置

 PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI)); aset.add(new MediaPrintableArea(0, 0, 150, 100, MediaPrintableArea.MM)); PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new PrintTask()); // You Printable here if (pj.printDialog(aset)) { try { pj.print(aset); } catch (PrinterException ex) { ex.printStackTrace(); } } 

或者你可以……

只需手动手动设置纸张/页面值…

 public static void main(String[] args) { PrinterJob pj = PrinterJob.getPrinterJob(); PageFormat pf = pj.defaultPage(); Paper paper = pf.getPaper(); // 10x15mm double width = cmsToPixel(10, 72); double height = cmsToPixel(15, 72); paper.setSize(width, height); // 10 mm border... paper.setImageableArea( cmsToPixel(0.1, 72), cmsToPixel(0.1, 72), width - cmsToPixel(0.1, 72), height - cmsToPixel(0.1, 72)); // Orientation pf.setOrientation(PageFormat.PORTRAIT); pf.setPaper(paper); PageFormat validatePage = pj.validatePage(pf); pj.setPrintable(new Printable() { @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { // Your code here return NO_SUCH_PAGE; } }, validatePage); try { pj.print(); } catch (PrinterException ex) { ex.printStackTrace(); } } // The number of CMs per Inch public static final double CM_PER_INCH = 0.393700787d; // The number of Inches per CMs public static final double INCH_PER_CM = 2.545d; // The number of Inches per mm's public static final double INCH_PER_MM = 25.45d; /** * Converts the given pixels to cm's based on the supplied DPI * * @param pixels * @param dpi * @return */ public static double pixelsToCms(double pixels, double dpi) { return inchesToCms(pixels / dpi); } /** * Converts the given cm's to pixels based on the supplied DPI * * @param cms * @param dpi * @return */ public static double cmsToPixel(double cms, double dpi) { return cmToInches(cms) * dpi; } /** * Converts the given cm's to inches * * @param cms * @return */ public static double cmToInches(double cms) { return cms * CM_PER_INCH; } /** * Converts the given inches to cm's * * @param inch * @return */ public static double inchesToCms(double inch) { return inch * INCH_PER_CM; } 

看起来您正在使用基于PageFormat的尺寸打印图像,而不是实际图像的尺寸,您的drawImage()方法应该看起来像这样

 graphics.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null)