How do I print a large PNG on an A4 sheet?
I want to print an image on A4 that I get programmatically. Here is the method for getting the image:
public BufferedImage getScreenComponent(Component component) {
BufferedImage image = new BufferedImage(
component.getWidth(),
component.getHeight(),
BufferedImage.TYPE_INT_RGB
);
component.paint( image.getGraphics() );
return image;
}
Here is the object Printable
:
Printable printable = new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
} else {
int pageWidth = (int) pageFormat.getWidth();
JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();
try {
Thread.sleep(1000);
Graphics2D graphics2D = (Graphics2D)graphics;
Robot robot = new Robot();
Rectangle rectangle = new Rectangle(pane.getX(),pane.getY(),pane.getWidth(),pane.getHeight());
BufferedImage screen = mainWindow.getScreenComponent(pane);
ImageIO.write(screen, "png", new File("screen.png"));
BufferedImage img = ImageIO.read(new File("D:\\TextEditor\\screen.png"));
graphics2D.drawImage(img, 0,0, img.getWidth(), img.getHeight(), null);
}
catch (AWTException ex){}
catch (IOException ex){}
catch (Exception ex){
System.err.println(ex.getMessage());
}
}
return Printable.PAGE_EXISTS;
}
};
Here is the handler for the print button click event:
if (e.getSource()==printButton) {
JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();
try {
PrinterJob printJob = PrinterJob.getPrinterJob();
PageFormat pf = printJob.pageDialog(printJob.defaultPage());
if (printJob.printDialog()==false) return;
printJob.setPrintable(printable, pf);
printJob.print();
Thread.sleep(1000);
In the Printable.print(Graphics graphics, PageFormat pageFormat, int pageIndex)
method, I formed an image of a text field with text. Here it is:
And in the same method, I try to print it out. The printer works, runs the sheet, but does not print anything. What could be the problem? I I don't know what to think, tell me. P.S. The size of the image comes out 1426Х756 пикс
0
Author: Konstantin_SH, 2019-12-14
1 answers
I found a way. Used PrintServices
created a new PrintJob
right inside the Printable.print()
{[5 method]}
Printable printableImgs = new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
} else {
int pageWidth = (int) pageFormat.getWidth();
JTextPane pane = scrollPaneList.get(tabs.getSelectedIndex()).getTextPane();
try {
Thread.sleep(1000);
Graphics2D graphics2D = (Graphics2D)graphics;
BufferedImage screen = mainWindow.getScreenComponent(pane);
ImageIO.write(screen, "png", new File("screen.png"));
// после получения скрина готовим данные к печати
DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
PrintService services[] = PrintServiceLookup.lookupPrintServices(flavor, null);
InputStream inputStream = new FileInputStream("screen.png");
Doc doc = new SimpleDoc(inputStream, flavor, null);
if(services.length>0){
DocPrintJob job = services[0].createPrintJob();
job.print(doc, null);
}
}
catch (Exception ex){
System.err.println(ex.getMessage());
}
}
return Printable.PAGE_EXISTS;
}
};
0
Author: Konstantin_SH, 2019-12-15 11:54:52