2014-11-20 2 views
1

В настоящее время у меня проблема с моим принтером, он отлично подходит для портретных изображений, но для пейзажных изображений он отсекает часть изображения и вместо этого заполняет пробел.java printerjob landscape white space

Это мой код

EDIT

PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); 
BufferedImage bufferedImage = ImageIO.read(new File("house.jpg")); 

boolean isLandscape = bufferedImage.getWidth() > bufferedImage.getHeight(); 
PrinterJob printerJob = PrinterJob.getPrinterJob(); 
printerJob.setPrintService(printService); 
printerJob.setCopies(copies); 

PageFormat pageFormat = printerJob.defaultPage(); 
pageFormat.setOrientation(isLandscape ? PageFormat.LANDSCAPE : PageFormat.PORTRAIT); 

Paper paper = new Paper(); 
paper.setSize(pageFormat.getWidth(), pageFormat.getHeight()); 
paper.setImageableArea(0.0, 0.0, paper.getWidth(), paper.getHeight()); 

pageFormat.setPaper(paper); 

printerJob.setPrintable(new Printable(){ 
    @Override 
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException{ 
     if (pageIndex == 0) { 
      Graphics2D g2 = (Graphics2D)graphics; 
      double xScale = 1; 
      double xTranslate = 0; 
      double yScale = 1; 
      double yTranslate = 0; 
      double widthScale = (pageFormat.getImageableWidth()/bufferedImage.getWidth()) * xScale; 
      double heightScale = (pageFormat.getImageableHeight()/bufferedImage.getHeight()) * yScale; 

      AffineTransform affineTransform = AffineTransform.getScaleInstance(widthScale, heightScale); 
      affineTransform.translate(xTranslate, yTranslate); 

      g2.drawRenderedImage(bufferedImage, affineTransform); 
      g2.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY()); 

      return PAGE_EXISTS; 
     }else return NO_SUCH_PAGE; 
    } 
}, pageFormat); 

printerJob.print(); 

Это позволяет мне печатать портретные фотографии, чтобы соответствовать данной бумаге и без границ (подходят к бумаге), мне это нужно делать то же самое для пейзажных фотографий пожалуйста.

Это примеры того, что происходит, когда я пытаюсь создать портретное и ландшафтное изображение, чтобы увидеть, что я имею в виду. Изображения должны всегда соответствовать размеру бумаги и безграничного, который в данном случае является 10x15cm,

Портрет изображения:

Пейзаж изображение:

ответ

0

Не используйте PageFormat#getWidth или PageFormat#getHeight, использование PageFormat#getImageableWidth и PageFormat#getImageableHeight вместо

от JavaDocs

Верните высоту/ширину в 1/72nds дюйма из области изображения на странице. Этот метод учитывает ориентацию страницы.

Вы должны также перевести принтер Graphics со стороны ImageableX/Y ...

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

Runnable пример

Это простой работоспособной пример. Этот код был в состоянии взять оригинал (слева) и распечатать его как в портретном и ландшафтном без вопроса ...

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.image.BufferedImage; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class PrintTest100 { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       try { 
        PrinterJob pj = PrinterJob.getPrinterJob(); 
        pj.setJobName(" Print Component "); 

        PageFormat pf = pj.defaultPage(); 
//     pf.setOrientation(PageFormat.LANDSCAPE); 
//     pf = pj.validatePage(pf); 

        pj.setPrintable(new ImagePrintable(ImageIO.read(new File("..."))), pf); 

        if (!pj.printDialog()) { 
         return; 
        } 
        try { 
         pj.print(); 
        } catch (PrinterException ex) { 
         ex.printStackTrace(); 
        } 
       } catch (IOException exp) { 
        exp.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public static class ImagePrintable implements Printable { 

     private int currentPage = -1; 
     private Image cachedScaledImage = null; 

     private BufferedImage master; 

     public ImagePrintable(BufferedImage master) { 
      this.master = master; 
     } 

     public double getScaleFactor(int iMasterSize, int iTargetSize) { 
      double dScale = 1; 
      if (iMasterSize > iTargetSize) { 
       dScale = (double) iTargetSize/(double) iMasterSize; 
      } else { 
       dScale = (double) iTargetSize/(double) iMasterSize; 
      } 
      return dScale; 
     } 

     public double getScaleFactorToFit(BufferedImage img, Dimension size) { 
      double dScale = 1; 
      if (img != null) { 
       int imageWidth = img.getWidth(); 
       int imageHeight = img.getHeight(); 
       dScale = getScaleFactorToFit(new Dimension(imageWidth, imageHeight), size); 
      } 
      return dScale; 
     } 

     public double getScaleFactorToFit(Dimension original, Dimension toFit) { 
      double dScale = 1d; 
      if (original != null && toFit != null) { 
       double dScaleWidth = getScaleFactor(original.width, toFit.width); 
       double dScaleHeight = getScaleFactor(original.height, toFit.height); 

       dScale = Math.min(dScaleHeight, dScaleWidth); 
      } 
      return dScale; 
     } 

     @Override 
     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 

      int result = Printable.NO_SUCH_PAGE; 

      if (pageIndex == 0) { 

       result = Printable.PAGE_EXISTS; 

       Graphics2D graphics2D = (Graphics2D) graphics; 
       graphics2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); 

       int width = (int) Math.round(pageFormat.getImageableWidth()); 
       int height = (int) Math.round(pageFormat.getImageableHeight()); 

       if (currentPage != pageIndex || cachedScaledImage == null) { 
        currentPage = pageIndex; 

        double scaleFactor = getScaleFactorToFit(new Dimension(master.getWidth(), master.getHeight()), new Dimension(width, height)); 

        int imageWidth = (int) Math.round(master.getWidth() * scaleFactor); 
        int imageHeight = (int) Math.round(master.getHeight() * scaleFactor); 

        cachedScaledImage = master.getScaledInstance(imageWidth, imageHeight, Image.SCALE_SMOOTH); 

       } 

       double x = ((pageFormat.getImageableWidth() - cachedScaledImage.getWidth(null))/2); 
       double y = ((pageFormat.getImageableHeight() - cachedScaledImage.getHeight(null))/2); 

       graphics2D.drawImage(cachedScaledImage, (int) x, (int) y, null); 
       graphics2D.setColor(Color.RED); 
       graphics2D.drawRect(0, 0, width - 1, height - 1); 
      } 

      return result; 
     } 
    } 

} 

нб: У меня была проблема с Йосемити, пытаясь выяснить, как чтобы изменить ориентацию печати в диалоговом окне, в конце я сдался и принудительно менял PageFormat с PrintJob. Я использовал этот же тип кода в бесчисленных приложений без проблем до ...

Изменено

Исходное изображение: 1920x1200

enter image description here

+0

я сделал то, что у сказал, заменить GetWidth и getHeight для getImageableWidth и getImageableHeight .... я также добавил строку g2.translate после g2.drawrenderedimage ... если я напечатаю портретное изображение, то это хорошо, но для пейзажа теперь он обрезает изображение еще больше ... он удаляет левый и правый размер изображения и просто позиция части изображение в центре бумаги.См. Edit – anonimoo90

+0

Проверить обновление с помощью запускаемого примера отлично работает для меня – MadProgrammer

+0

спасибо, но он по-прежнему не заполняет бумагу по ландшафту, она режет ландшафтное изображение, левую и правую сторону. Он просто печатает центр изображения – anonimoo90