2016-07-26 11 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を印刷するためのコードがあります。これを変更して、pngからBufferedImageを出力することができます。

イメージは比例しているため、ページは水平または垂直にしか塗りつぶされませんが、両方には塗りつぶされません。

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

    } 

} 
関連する問題