Ich möchte ein Bild in Java drucken.import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
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;
public class PrintA4Test {
public static double imageableX;
public static double imageableY;
public static double imageableWidth;
public static double imageableHeight;
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("/home/$user/test.png"));
PrinterJob pj = PrinterJob.getPrinterJob();
if (pj.printDialog()) {
PageFormat pf = pj.defaultPage();
Paper paper = pf.getPaper();
imageableX = 0;
imageableY = 0;
imageableWidth = pf.getWidth() - (2 * imageableX);
imageableHeight = pf.getHeight() - (2 * imageableY);
paper.setImageableArea(imageableX, imageableY, imageableWidth, imageableHeight);
pf.setOrientation(PageFormat.LANDSCAPE);
pf.setPaper(paper);
PageFormat validatePage = pj.validatePage(pf);
pj.setPrintable(new TestPrintable(image), validatePage);
try {
pj.print();
}
catch (PrinterException ex) {
ex.printStackTrace();
}
}
}
public static class TestPrintable implements Printable {
private BufferedImage image;
public TestPrintable(BufferedImage image) {
this.image = image;
}
@Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
Graphics2D g2d = (Graphics2D) g.create();
if (page != 0){
return NO_SUCH_PAGE;
}
g2d.drawImage(image.getScaledInstance((int)imageableHeight, (int)imageableWidth, BufferedImage.SCALE_SMOOTH), (int)imageableX, (int)imageableY, null);
g2d.dispose();
return PAGE_EXISTS;
}
}
}
< /code>
Nach dem Start erhalte ich diese Ausnahme: < /p>
java.lang.NullPointerException: Cannot invoke "java.awt.image.ImageConsumer.setColorModel(java.awt.image.ColorModel)" because "this.theConsumer" is null
at java.desktop/sun.awt.image.OffScreenImageSource.sendPixels(OffScreenImageSource.java:171)
at java.desktop/sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:187)
at java.desktop/sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66)
at java.desktop/sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80)
at java.desktop/java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:184)
at java.desktop/sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:732)
at java.desktop/sun.awt.image.ToolkitImage.addWatcher(ToolkitImage.java:221)
at java.desktop/sun.awt.image.ToolkitImage.getHeight(ToolkitImage.java:142)
at java.desktop/sun.print.PeekGraphics$ImageWaiter.waitForDimensions(PeekGraphics.java:1888)
at java.desktop/sun.print.PeekGraphics$ImageWaiter.(PeekGraphics.java:1876)
at java.desktop/sun.print.PeekGraphics.drawImage(PeekGraphics.java:955)
at PrintA4Test$TestPrintable.print(PrintA4Test.java:81)
at java.desktop/sun.print.RasterPrinterJob.printPage(RasterPrinterJob.java:2278)
at java.desktop/sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1657)
at java.desktop/sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1487)
at PrintA4Test.main(PrintA4Test.java:49)
< /code>
Drawimage legt die Ausnahme aus. Ich habe dies mit Temurin 19.0.2 auf Ubuntu 22.04 getestet. synchron?
Wie vermeide ich die Ausnahme?
[url=viewtopic.php?t=14917]Ich möchte[/url] ein Bild in Java drucken.import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
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;
public class PrintA4Test {
public static double imageableX;
public static double imageableY;
public static double imageableWidth;
public static double imageableHeight;
public static void main(String[] args) throws IOException {
BufferedImage image = ImageIO.read(new File("/home/$user/test.png"));
PrinterJob pj = PrinterJob.getPrinterJob();
if (pj.printDialog()) {
PageFormat pf = pj.defaultPage();
Paper paper = pf.getPaper();
imageableX = 0;
imageableY = 0;
imageableWidth = pf.getWidth() - (2 * imageableX);
imageableHeight = pf.getHeight() - (2 * imageableY);
paper.setImageableArea(imageableX, imageableY, imageableWidth, imageableHeight);
pf.setOrientation(PageFormat.LANDSCAPE);
pf.setPaper(paper);
PageFormat validatePage = pj.validatePage(pf);
pj.setPrintable(new TestPrintable(image), validatePage);
try {
pj.print();
}
catch (PrinterException ex) {
ex.printStackTrace();
}
}
}
public static class TestPrintable implements Printable {
private BufferedImage image;
public TestPrintable(BufferedImage image) {
this.image = image;
}
@Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
Graphics2D g2d = (Graphics2D) g.create();
if (page != 0){
return NO_SUCH_PAGE;
}
g2d.drawImage(image.getScaledInstance((int)imageableHeight, (int)imageableWidth, BufferedImage.SCALE_SMOOTH), (int)imageableX, (int)imageableY, null);
g2d.dispose();
return PAGE_EXISTS;
}
}
}
< /code>
Nach dem Start erhalte ich diese Ausnahme: < /p>
java.lang.NullPointerException: Cannot invoke "java.awt.image.ImageConsumer.setColorModel(java.awt.image.ColorModel)" because "this.theConsumer" is null
at java.desktop/sun.awt.image.OffScreenImageSource.sendPixels(OffScreenImageSource.java:171)
at java.desktop/sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:187)
at java.desktop/sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66)
at java.desktop/sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80)
at java.desktop/java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:184)
at java.desktop/sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:732)
at java.desktop/sun.awt.image.ToolkitImage.addWatcher(ToolkitImage.java:221)
at java.desktop/sun.awt.image.ToolkitImage.getHeight(ToolkitImage.java:142)
at java.desktop/sun.print.PeekGraphics$ImageWaiter.waitForDimensions(PeekGraphics.java:1888)
at java.desktop/sun.print.PeekGraphics$ImageWaiter.(PeekGraphics.java:1876)
at java.desktop/sun.print.PeekGraphics.drawImage(PeekGraphics.java:955)
at PrintA4Test$TestPrintable.print(PrintA4Test.java:81)
at java.desktop/sun.print.RasterPrinterJob.printPage(RasterPrinterJob.java:2278)
at java.desktop/sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1657)
at java.desktop/sun.print.RasterPrinterJob.print(RasterPrinterJob.java:1487)
at PrintA4Test.main(PrintA4Test.java:49)
< /code>
Drawimage legt die Ausnahme aus. Ich habe dies mit Temurin 19.0.2 auf Ubuntu 22.04 getestet. synchron?
Wie vermeide ich die Ausnahme?