2

我想使用 javafx 打印从Pdf-Renderer库中打印一个PDFFile对象。是否可以打印非Node对象?目前我正在使用 AWT 打印(查看此示例),但它与 javafx 不兼容,因为当 AWT 打印对话框出现时,我的 javafx 窗口会冻结。

Printer printer = Printer.getDefaultPrinter();
PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT);

PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
    boolean success = job.printPage(node); // use something otherthan a node(PDFFile in my case)
    if (success) {
        job.endJob();
    }
}
4

1 回答 1

3

您可以java.awt.Image从每一页中获取 a ,将页面绘制为 a ,将 ajava.awt.image.BufferedImage转换BufferedImage为 a javafx.scene.image.Image,最后打印ImageView包含图像的 a :

就像是:

PrinterJob job = PrinterJob.createPrinterJob();
PDFFile pdfFile = ... ;
if (job != null) {
    boolean success = true ;
    for (int pageNumber = 1; pageNumber <= pdfFile.getNumPages() ; pageNumber++) {
        PDFPage page = pdfFile.getPage(pageNumber, true);
        Rectangle2D bounds = page.getBBox();
        int width = (int) bounds.getWidth();
        int height = (int) bounds.getHeight();
        java.awt.Image img = page.getImage(width, height, bounds, null, true, true);
        BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        bImg.createGraphics().drawImage(img, 0, 0, null);
        javafx.scene.image.Image fxImg = SwingFXUtils.toFXImage(bImg, null);
        ImageView imageView = new ImageView(fxImg);
        success = success & job.printPage(imageView);
    }

    if (success) {
        job.endJob();
    }
}

请注意,此代码可以在 FX 应用程序线程之外执行,以保持 UI 响应。

于 2016-05-02T13:15:02.217 回答