【问题标题】:Proper way of printing a BufferedImage in Java在 Java 中打印 BufferedImage 的正确方法
【发布时间】:2013-08-23 13:50:36
【问题描述】:

我想知道是否有在 Java 中打印 BufferedImage 的正确方法。 基本上我已经创建了一个工作正常的照片处理程序,我可以保存图像等。 但我真正的目标是将其发送到打印机软件,以便您可以选择要打印的页数和页面类型。

所以我的简短问题是,如何将缓冲图像发送到打印机,以便弹出打印机选择屏幕等然后能够打印?

如果有人可以向我展示这方面的示例,将不胜感激。

【问题讨论】:

  • Printing 可能是一个很好的起点。
  • @mre 这与我用于从 Java 应用程序打印的教程相同,非常好。我还要推荐另一个资源:javaworld.com/jw-10-2000/jw-1020-print.html。这两篇文章都假设有一些 Java 知识,但没有任何使用打印 API 的知识,应该是一个很好的指南和基础。

标签: java graphics printing bufferedimage graphics2d


【解决方案1】:

这是我的一个 Java 项目中的一个。此代码将缩放并在打印机页面上打印一个图像。

你这样称呼它:

    printButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            //Start a Thread
            new Thread(new PrintActionListener(image)).start();         
        }
    });

这是可运行的:

import java.awt.Graphics;
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;

public class PrintActionListener implements Runnable {

    private BufferedImage       image;

    public PrintActionListener(BufferedImage image) {
        this.image = image;
    }

    @Override
    public void run() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable(new ImagePrintable(printJob, image));

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

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

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2013-08-29
    • 1970-01-01
    • 2010-10-10
    • 2012-09-23
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多