当前位置: 首页 > 知识库问答 >
问题:

JavaFX在多个页面上打印桌面视图

姜增
2023-03-14

所以,我的问题是,我需要打印tableview的内容,但其中的项目太多,它只打印其中的前23个。我已经在这里找到了一些解决方案,不幸的是,它们没有多大帮助。

这是我的打印方法:

@FXML
private void printIt() {
    Printer printer = Printer.getDefaultPrinter();
    PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.DEFAULT);
    double scaleX = pageLayout.getPrintableWidth() / logBookTable.getBoundsInParent().getWidth();
    double scaleY = pageLayout.getPrintableHeight() / logBookTable.getBoundsInParent().getHeight();
    logBookTable.getTransforms().add(new Scale(scaleX, scaleY));

    PrinterJob job = PrinterJob.createPrinterJob();
    if (job != null) {
        boolean successPrintDialog = job.showPrintDialog(dialogStage);
        if(successPrintDialog){
            boolean success = job.printPage(pageLayout,logBookTable);
            if (success) {
                job.endJob();
            }
        }
    }
}

共有3个答案

黄流觞
2023-03-14

打印机打印机=打印机。getDefaultPrinter();

            Printer printer = Printer.getDefaultPrinter();PrinterJob  printerJob = PrinterJob.createPrinterJob();
            PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.HARDWARE_MINIMUM);
            printerJob.getJobSettings().setPageLayout(pageLayout);
            Stage stage = (Stage) anchorPane.getScene().getWindow();
            boolean openPrintDialog = printerJob.showPrintDialog(stage);
            if(openPrintDialog){
                tableView.setScaleX(0.8);
                tableView.setScaleY(0.8);
                tableView.setTranslateX(-70);
                tableView.setTranslateY(-50);
                ObservableList<List<SimpleStringProperty>> allPrintItems = tableView.getItems();
                ObservableList <List<SimpleStringProperty>> pageList = FXCollections.observableArrayList();
                boolean printing = false;
                for(int i=0; i<allPrintItems.size(); i++) {
                    List<SimpleStringProperty> oneRow = allPrintItems.get(i);
                    pageList.add(oneRow);
                    if(i!=0 && (i%24==0 || i == (allPrintItems.size()-1))){
                        tableView.setItems(pageList);
                        printing = printerJob.printPage(tableView);
                        pageList.clear();
                    }
                }
                tableView.setItems(allPrintItems);
                if(printing)printerJob.endJob();
                tableView.setScaleX(1.0);
                tableView.setScaleY(1.0);
                tableView.setTranslateX(0);
                tableView.setTranslateY(0);
文增
2023-03-14

我自己找到了解决方案

1) 为循环创建

2)创建新表格并插入未打印的项目

3) 打印

许琛
2023-03-14

我看了很多帖子,才想出答案。关键是延长桌面视图的高度,而不需要在屏幕右侧滚动。(有一些方法可以在不扭曲程序布局的情况下做到这一点。我没有在这个问题中提到这部分。关于如何完成这项任务,有很好的答案。)一旦你将桌面视图的高度扩展到显示的所有行,而不需要滚动条。然后从零高度开始一次打印一页,直到一页的负高度。(在这种情况下:向下接近11英寸。边框在其中发挥作用。)下一页应该从最后一页结束的地方开始,向下打印几乎11英寸。(从大约-11英寸到大约-22英寸。)这种模式一直持续到整个桌面视图的高度被遍历。

    Printer printer = Printer.getDefaultPrinter(); //get the default printer
    javafx.print.PageLayout pageLayout = printer.createPageLayout(Paper.NA_LETTER, PageOrientation.PORTRAIT, Printer.MarginType.DEFAULT); //create a pagelayout.  I used Paper.NA_LETTER for a standard 8.5 x 11 in page.
    PrinterJob job = PrinterJob.createPrinterJob();//create a printer job

    if(job.showPrintDialog(taMain.getScene().getWindow()))// this is very useful it allows you to save the file as a pdf instead using all of your printer's paper. A dialog box pops up, allowing you to change the "name" option from your default printer to Adobe pdf. 
    {
        double pagePrintableWidth = pageLayout.getPrintableWidth(); //this should be 8.5 inches for this page layout.
        double pagePrintableHeight = pageLayout.getPrintableHeight();// this should be 11 inches for this page layout.


        tblvMain.prefHeightProperty().bind(Bindings.size(tblvMain.getItems()).multiply(35));// If your cells' rows are variable size you add the .multiply and play with the input value until your output is close to what you want. If your cells' rows are the same height, I think you can use .multiply(1). This changes the height of your tableView to show all rows in the table.
        tblvMain.minHeightProperty().bind(tblvMain.prefHeightProperty());//You can probably play with this to see if it's really needed.  Comment it out to find out.
        tblvMain.maxHeightProperty().bind(tblvMain.prefHeightProperty());//You can probably play with this to see if it' really needed.  Comment it out to find out.

        double scaleX = pagePrintableWidth / tblvMain.getBoundsInParent().getWidth();//scaling down so that the printing width fits within the paper's width bound.
        double scaleY = scaleX; //scaling the height using the same scale as the width. This allows the writing and the images to maintain their scale, or not look skewed.
        double localScale = scaleX; //not really needed since everything is scaled down at the same ratio. scaleX is used thoughout the program to scale the print out.

        double numberOfPages = Math.ceil((tblvMain.getPrefHeight() * localScale) / pagePrintableHeight);//used to figure out the number of pages that will be printed.



        //System.out.println("pref Height: " + tblvMain.getPrefHeight());
        //System.out.println("number of pages: " + numberOfPages);


        tblvMain.getTransforms().add(new Scale(scaleX, (scaleY)));//scales the printing. Allowing the width to say within the papers width, and scales the height to do away with skewed letters and images.
        tblvMain.getTransforms().add(new Translate(0, 0));// starts the first print at the top left corner of the image that needs to be printed

        //Since the height of what needs to be printed is longer than the paper's heights we use gridTransfrom to only select the part to be printed for a given page.
        Translate gridTransform = new Translate();
        tblvMain.getTransforms().add(gridTransform);

        //now we loop though the image that needs to be printed and we only print a subimage of the full image.
        //for example: In the first loop we only pint the printable image from the top down to the height of a standard piece of paper. Then we print starting from were the last printed page ended down to the height of the next page. This happens until all of the pages are printed. 
        // first page prints from 0 height to -11 inches height, Second page prints from -11 inches height to -22 inches height, etc. 
        for(int i = 0; i < numberOfPages; i++)
        {
            gridTransform.setY(-i * (pagePrintableHeight / localScale));
            job.printPage(pageLayout, tblvMain);
        }

        job.endJob();//finally end the printing job.
 类似资料:
  • 问题内容: 我已经阅读了很多有关打印页码的网站,但是当我尝试打印html页面时,仍然无法显示它。 接下来是CSS代码: 我试图把这个页面规则放进去 在其外部,尝试将其放入中,但没有任何帮助使我在页面上显示页码。我尝试使用FireFox和Chrome(您知道基于WebKit的浏览器)。我认为问题出在我的HTML或CSS代码中。 有人可以告诉我一个在具有多个页面的大html页面中实现此规则的示例吗?我

  • 如何打印窗格或整个FXML页面。我尝试了这两种方法(doPrint和doPrintSecond在控制器中)进行打印,但不起作用;请纠正我的错误。是否有其他方法可以打印fxml页面或窗格。 FXML代码 控制器代码 这是应用程序,我点击打印按钮,但它不工作。

  • 问题内容: 我有一个客户想打印的网页,而我遇到的麻烦是让页脚位于最后一个打印页面的底部,而不仅仅是内容结束时 我尝试了类似的东西 但它在每页末尾显示页脚。 也许我对CSS的要求太高了…可行吗? 我想我应该对 的(^_^)发疯 问题答案: 尝试将相对的身体和绝对的页脚定位: 借助CSS 3 Paged Media模块,您可以使用以下代码:

  • 问题内容: 根据我的研究,看来我想做的事是不可能的,但是如果情况有所变化,我想检查一下是否有人想出办法。 我有一个Web应用程序,可以根据浏览器窗口中的用户选择生成打印报告。我有一个自定义的页眉和页脚,当从浏览器打印报告时,应在每个打印的页面上重复该页眉和页脚。它不是我需要的浏览器页眉和页脚,而是我生成的自定义页眉和页脚。另外,我不认为这是CSS和媒体类型的问题,但我不是CSS专家。我没有让页眉和

  • 在某些情况下,需要在网页上放置一个按钮,以便使用实际的打印机来打印网页的内容。 JavaScript帮助我们实现了打印网页的实现。 当执行JavaScript中的打印功能时,它将打印当前网页。只需在事件中使用它即可直接调用此函数。 语法 示例代码: 运行结果如下:

  • 很多时候,您希望在网页上放置一个按钮,通过实际的打印机打印该网页的内容。 JavaScript帮助您使用window对象的print函数实现此功能。 JavaScript打印函数window.print()在执行时打印当前网页。 您可以使用onclick事件直接调用此函数,如以下示例所示。 例子 (Example) <html> <body> <form>