【问题标题】:JavaFX8 Print API : how to set correctly the Printable areaJavaFX8 Print API:如何正确设置可打印区域
【发布时间】:2015-07-05 13:47:20
【问题描述】:

在我的 javafx 应用程序中,我使用 JavaFX 8 打印 API 打印节点,我遇到了打印区域的问题,尽管我已经用 A4 纸设置了 pageLayout .... 这是我的代码:

public static  void printNode(final Node node) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Printer printer = Printer.getDefaultPrinter();   
        PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, 0,0,0,0 );      
        PrinterJob job = PrinterJob.createPrinterJob();
        if (job != null  && job.showPrintDialog(node.getScene().getWindow()) ) { 
            boolean success = job.printPage(pageLayout, node);                   
            if (success) {
                job.endJob();
            }
        }

这是我要打印的节点的快照:

这是我打印节点时得到的结果

【问题讨论】:

    标签: printing javafx


    【解决方案1】:

    在您的方法中,您需要获得硬件能力边距。即使您将边距设置为 0,您的打印机在纸张周围也有不可打印的边距。

    如果打印出来,可以查看页边距:

    System.out.println("PageLayout: " + pageLayout.toString());
    

    而且您无法将边距设置为小于零的值。因此,您需要扩展要打印的节点。节点将被缩放、打印然后取消缩放。

      public static void printNode(final Node node) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Printer printer = Printer.getDefaultPrinter();
        PageLayout pageLayout
            = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);
        PrinterAttributes attr = printer.getPrinterAttributes();
        PrinterJob job = PrinterJob.createPrinterJob();
        double scaleX
            = pageLayout.getPrintableWidth() / node.getBoundsInParent().getWidth();
        double scaleY
            = pageLayout.getPrintableHeight() / node.getBoundsInParent().getHeight();
        Scale scale = new Scale(scaleX, scaleY);
        node.getTransforms().add(scale);
    
        if (job != null && job.showPrintDialog(node.getScene().getWindow())) {
          boolean success = job.printPage(pageLayout, node);
          if (success) {
            job.endJob();
    
          }
        }
        node.getTransforms().remove(scale);
      }
    

    受到此处找到的解决方案的启发:https://carlfx.wordpress.com/2013/07/15/introduction-by-example-javafx-8-printing/

    【讨论】:

    • 边距必须 >=0 ,这是一个例外:Caused by: java.lang.IllegalArgumentException: Margins must be >= 0 at javafx.print.Printer.createPageLayout(Printer.java:346) at classes.JavaFxPrint.printNode(JavaFxPrint.java:31)
    • @KradraBelkacem 我已经更新了我的答案,所以现在应该适合你的问题了。
    • 我遇到了同样的问题,打印方法没有覆盖所有节点。对象打印机属性怎么样?你怎么还没用呢。
    • PrinterAttributes 是只读的,它反映了您设备的能力。如果缩放不够,请进一步缩小,直到适合页面。
    • @NwDx :您能否检查一下有关使用 JavaFX 打印的问题:stackoverflow.com/questions/34815660/…
    【解决方案2】:

    EDIT(在Menai Ala Eddine 备注之后):如果要打印一个区域(节点的子级和所有控件、窗格和图表的父级),那么您可以更改参数节点与区域 并使用此解决方案:[END_EDIT]

    由于我无法添加任何 cmets,我将把我的解决方案放在这里。我修改了 @NwDx 的答案(它对我不起作用,我最终得到了一些奇怪的缩放),通过将节点的 prefSize 设置为打印页面布局大小,使用这行代码:

    node.setPrefSize(pageLayout.getPrintableWidth(), pageLayout.getPrintableHeight());
    

    整个 sn-p 现在看起来像这样:

    public static void printNode(final Region region) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Printer printer = Printer.getDefaultPrinter();
        PageLayout pageLayout
            = printer.createPageLayout(Paper.A4, PageOrientation.PORTRAIT, Printer.MarginType.HARDWARE_MINIMUM);
        PrinterJob job = PrinterJob.createPrinterJob();
    
         region.setPrefSize(pageLayout.getPrintableWidth(), pageLayout.getPrintableHeight());
        if (job != null && job.showPrintDialog(region.getScene().getWindow())) {
          boolean success = job.printPage(pageLayout, region);
          if (success) {
            job.endJob();
          }
        }
      }
    

    【讨论】:

    • 我找不到节点的 setPrefSize 符号。
    • 哦,这是我的错。我在这个例子中使用了 AnchorPane 并且没有检查这里的参数是 Node 类型,它是一个抽象类并且不包含这个方法。我要做的是,如果您打算将它与相同的参数一起使用,请相应地对其进行转换,然后使用此方法。虽然这仅适用于区域类型节点,但我会编辑我的答案:) 谢谢
    • 只需添加 -instanceof_ 来指定节点的类型。
    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多