2016-07-26 9 views
0

Ich drucke ein PNG-Bild auf dem Drucker. Das Bild wird in der Mitte der Seite gedruckt und füllt nicht die ganze Seite aus. Ich habe versucht, die Größe des Bildes zu erhöhen, aber es ist immer in der Mitte der Seite. Irgendwelche Ideen, wie es zur Seite passt?An Seite anpassen, wenn ein Bild gedruckt wird

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

Duplizieren von http://stackoverflow.com/questions/27029166/java-printerjob-not-printing-to-fit-paper – SomeDude

Antwort

0

Im Wesentlichen müssen Sie die Größe des Bildes anpassen, um in die Seitenabmessungen zu passen. Darüber hinaus definiert der Druckertreiber standardmäßig einen Seitenrahmenbereich. Um die ganze Seite zu verwenden, müssen Sie diese Ränder entfernen. Manchmal ist es jedoch unmöglich, die Rahmen zu entfernen, da sie vom Druckertreiber gesteuert werden. So können Sie steuern, was der von Ihnen gesteuerte Treiber ist.

Ich denke, Sie möchten nicht ein gestrecktes Bild drucken, so dass Sie das Bild richtig skalieren müssen. Es gibt einen anderen Beitrag, der derselbe zu sein scheint und zeigt, wie das Bild skaliert wird: Fit image into the printing area

0

Hier ist ein Code, mit dem ich ein Java Swing JPanel drucken kann. Sie können es ändern, um ein BufferedImage von einem PNG zu drucken.

Ich halte das Bild proportional, also füllt es nur die Seite horizontal oder vertikal, aber nicht beides.

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

    } 

}