java PrinterJob不打印以适合纸张

时间:2014-11-19 23:38:57

标签: java printing

我在使用默认打印机打印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 printing

发布的答案

2 个答案:

答案 0 :(得分:4)

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

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

接下来,请确保您使用imageableWidth的{​​{1}}和imageableHeight

PageFormat

而不是double width = pageFormat.getImageableWidth(); double height = pageFormat.getImageableHeight(); / width属性。其中许多事情都是从不同的背景下翻译出来的......

height

graphics.drawImage(image, 0, 0, (int)width, (int)height, null); 在页面方向的上下文中返回页面大小

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

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

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

例如......

你有两个选择......

你可以......

显示getImageableWidth/Height并确保选择了正确的页面设置

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();
    }
}

答案 1 :(得分:0)

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

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