使用 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;
}
}
我正在尝试使用 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;
}
}