使用 JavaFX 打印无边界图像

Printing an image borderless using JavaFX

我正在尝试使用 javafx Printer 方法打印无边框照片。我试过使用旧的 awt Printer 方法,但也不走运。

我的问题是打印机没有选择无边距纸选项,例如'Borderless 4x6in.',Windows 上的打印作业显示为“4x6in”。作为选定的论文。

这是我的打印函数:

private boolean print(Paper paper, Printer printer, BufferedImage image) {

        Image fxImage = SwingFXUtils.toFXImage(image, null);
        ImageView ivImage = new ImageView(fxImage);

        PageLayout pageLayout = printer.createPageLayout(paper, PageOrientation.LANDSCAPE, Printer.MarginType.HARDWARE_MINIMUM);

        double scaleX = pageLayout.getPrintableWidth() / fxImage.getWidth();
        double scaleY = pageLayout.getPrintableHeight() / fxImage.getHeight();
        ivImage.getTransforms().add(new Scale(scaleX, scaleY));

        javafx.print.PrinterJob job = javafx.print.PrinterJob.createPrinterJob(printer);
        job.getJobSettings().setPageLayout(pageLayout);
        job.getJobSettings().setJobName(paper.getName());
        System.out.println("PageLayout: " + pageLayout.toString());
        boolean printed = job.printPage(ivImage);
        if (printed)
        {
            job.endJob();
            return true;
        }
        else
        {
            return false;
        }
    }

这里是 println 的输出:

PageLayout: Paper=Paper: Borderless 4x6in. size=101.6x152.4 MM Orient=LANDSCAPE leftMargin=0.0 rightMargin=0.0 topMargin=0.0 bottomMargin=0.0

一切看起来都不错,但是当它到达 Windows 中的打印队列时,这些是它的属性: Print job properties

如您所见,未选中无边框框,生成的打印件在顶部和右侧有约 5 毫米的边框(有趣的是底部或左侧没有)。有没有我错过的陷阱?我的打印机可以从 Windows 照片查看器打印出无边界的精细照片..

我选的是printer.getPrinterAttributes().getSupportedPapers()套纸,绝对支持这个尺寸!

任何建议表示赞赏(虽然理想情况下不想回到 java.awt)

干杯!

所以在经历了相当多的挫折之后,有人建议我只使用 Windows 调用打印机。这是第一次工作,非常简单!唯一的限制是它使用打印机的默认设置打印,这意味着您必须事先设置它们——这对我的用例来说不是一个大问题。生成的打印函数是这样的:

private boolean print(Printer printer, String imagePath) {

    Process p;
    try {
        String execString = String.format("rundll32 C:\WINDOWS\system32\shimgvw.dll ImageView_PrintTo \"%s\" \"%s\"",imagePath,printer.getName());
        p = Runtime.getRuntime().exec(execString);
        p.waitFor();

        if (p.exitValue() == 0)
        {
            // Success
            return true;
        }
        else
        {
            // Write Error Message
            return false;
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } catch (InterruptedException e) {
        e.printStackTrace();
        return false;
    }


}