2016-07-26 2 views
0

Я печатаю PNG-изображение на принтере. Изображение печатается в центре страницы и не заполняет всю страницу. Я пытался увеличить размер изображения, но всегда находился в центре страницы. Любые идеи, как сделать его подходящим для страницы?Подходит для печати при печати изображения

psStream = new URL(url).openStream(); 
       if (psStream == null) { 
        return "Unable to fetch image"; 
       } 
       DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG; 
       Doc myDoc = new SimpleDoc(psStream, flavor, null); 
       PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
       PrintServiceAttributeSet attributes = new HashPrintServiceAttributeSet(); 
       attributes.add(new PrinterName(printData.printer, Locale.getDefault())); 
       final PrintService[] printServices = PrintServiceLookup.lookupPrintServices(flavor, attributes); 
       if (printServices.length == 0) { 
        return "Could not find printer " + printData.printer; 
       } else { 
        myPrinter = printServices[0]; 
        DocPrintJob job = myPrinter.createPrintJob(); 

        try { 
         job.print(myDoc, aset); 
         return null; 
        } catch (Exception e) { 
         e.printStackTrace(); 
         return "Could not print : " + e.getMessage(); 
        } 

       } 
+0

Дубликат http://stackoverflow.com/questions/27029166/java-printerjob-not-printing-to-fit-paper – SomeDude

ответ

0

По существу, вы должны изменить размер изображения в соответствии с размерами страницы. Кроме того, по умолчанию драйвер принтера определяет область границы страницы. Поэтому, чтобы использовать всю страницу, вы должны удалить эти границы. Однако иногда невозможно удалить границы, потому что они контролируются драйвером принтера, поэтому вы можете контролировать только то, что вы контролируете.

public void print(String imageFileName) throws IOException, PrinterException { 
    final PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); 
    final BufferedImage image = ImageIO.read(new File(imageFileName)); 
    final PrinterJob printJob = PrinterJob.getPrinterJob(); 
    printJob.setJobName("MyApp: " + imageFileName); 
    printJob.setPrintService(printService); 
    printJob.setPrintable(new Printable() { 
     @Override 
     public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 
      if (pageIndex == 0) { 
       final Paper paper = pageFormat.getPaper(); 
       paper.setImageableArea(0.0, 0.0, pageFormat.getPaper().getWidth(), pageFormat.getPaper().getHeight()); 
       pageFormat.setPaper(paper); 
       graphics.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY()); 
       graphics.drawImage(image, 0, 0, (int) pageFormat.getPaper().getWidth(), (int) pageFormat.getPaper().getHeight(), null); 
       return PAGE_EXISTS; 
      } else { 
       return NO_SUCH_PAGE; 
      } 
     } 
    }); 
    printJob.print(); 
} 

Я думаю, вы не хотите печатать растянутое изображение, поэтому вам нужно правильно масштабировать изображение. Есть еще одна запись, которая кажется одинаковой и показывает, как масштабировать изображение: Fit image into the printing area

0

Вот код, который я использую для печати Java Swing JPanel. Вы можете изменить его, чтобы напечатать BufferedImage из png.

Я сохраняю изображение пропорциональным, поэтому оно заполняет страницу только по горизонтали или по вертикали, но не по обеим сторонам.

package com.ggl.sudoku.solver.controller; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
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 javax.swing.JPanel; 

import com.ggl.sudoku.solver.view.SudokuFrame; 

public class PrintActionListener implements Runnable { 

    private SudokuFrame frame; 

    public PrintActionListener(SudokuFrame frame) { 
     this.frame = frame; 
    } 

    @Override 
    public void run() { 
     final BufferedImage image = createPanelImage(); 

     PrinterJob printJob = PrinterJob.getPrinterJob(); 
     printJob.setPrintable(new ImagePrintable(printJob, image)); 

     if (printJob.printDialog()) { 
      try { 
       printJob.print(); 
      } catch (PrinterException prt) { 
       prt.printStackTrace(); 
      } 
     } 
    } 

    private BufferedImage createPanelImage() { 
     JPanel panel = frame.getSudokuPanel(); 
     BufferedImage image = new BufferedImage(panel.getWidth(), 
       panel.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = image.createGraphics(); 
     panel.paint(g); 
     g.dispose(); 
     return image; 
    } 

    public class ImagePrintable implements Printable { 

     private double   x, y, width; 

     private int    orientation; 

     private BufferedImage image; 

     public ImagePrintable(PrinterJob printJob, BufferedImage image) { 
      PageFormat pageFormat = printJob.defaultPage(); 
      this.x = pageFormat.getImageableX(); 
      this.y = pageFormat.getImageableY(); 
      this.width = pageFormat.getImageableWidth(); 
      this.orientation = pageFormat.getOrientation(); 
      this.image = image; 
     } 

     @Override 
     public int print(Graphics g, PageFormat pageFormat, int pageIndex) 
       throws PrinterException { 
      if (pageIndex == 0) { 
       int pWidth = 0; 
       int pHeight = 0; 
       if (orientation == PageFormat.PORTRAIT) { 
        pWidth = (int) Math.min(width, (double) image.getWidth()); 
        pHeight = pWidth * image.getHeight()/image.getWidth(); 
       } else { 
        pHeight = (int) Math.min(width, (double) image.getHeight()); 
        pWidth = pHeight * image.getWidth()/image.getHeight(); 
       } 
       g.drawImage(image, (int) x, (int) y, pWidth, pHeight, null); 
       return PAGE_EXISTS; 
      } else { 
       return NO_SUCH_PAGE; 
      } 
     } 

    } 

} 
Смежные вопросы