2012-05-15 6 views
2

Я пытаюсь написать программу photobooth, но мне трудно печатать без полей. Я очень близок, но изображение не заполняет печать размером 4 "x 6". Я был бы признателен за любые советы по достижению печати без полей.Печать без полей

Cheers!

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

+0

Если принтер не поддерживает [full bleed] (http://en.wikipedia.org/wiki/Bleed_%28printing%29), это может быть невозможно. – trashgod

+0

Я не уверен, что принтеры могут выполнять полное удаление, но я знаю, что я могу получать печати без полей, используя функцию печати в Windows Image Viewer. Поэтому я предполагаю, что моя цель - добиться чего-то подобного. – Johnny

+0

У меня такая же ситуация, как на Mac. 'lp' из командной строки не имеет проблем с печатью полного истечения 4x6, но Java ставит огромные поля с каждой стороны, которые, как представляется, не может удалить setImageableArea. –

ответ

1

Я боролся с теми же проблемами на некоторое время теперь. Вот мое решение:

Определить фактический размер страницы вашего принтера:

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

Для моих Hiti P720L фотопринтеров с 4 «x6» бумаге это было на самом деле 4,133 «x6.147».

Создать и установить новый объект бумаги с полным размером страницы и полной гарантируемой зоной:

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 на 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); 
Смежные вопросы