【问题标题】:Printing Data in Java用 Java 打印数据
【发布时间】:2012-07-08 22:15:57
【问题描述】:

我有一个表单,用户可以在其中填写数据。 此后,他/她将能够将数据导出为我已经编写的 pdf,如下所示:

public void onSubmit() {
try {
    ManagerModel manager = managerDao.getManager(person);
    PictureModel picture = new PictureModel();
    if (person.getPhotoId() != null) {
        picture = new PictureModel(pictureDao.findPictureById(person.getPhotoId()));
    }
    getRequestCycle().setRequestTarget( new FileRequestTarget(Exporter.exportFile(person, manager, picture), person.getPdfName()));
} catch (Exception e) {
    Log.warn(e);
}

现在这为我提供了 pdf 导出以及所有数据。我还想创建一个按钮,允许用户打印在这些字段中输入的数据。现在,这应该是表单上的打印按钮,而不是要求用户导出然后打印。

有人可以建议我如何创建此打印按钮吗?我应该只使用 pdf 导出的输出然后将其发送到打印机吗?如果是这样,我该如何用java编写?

【问题讨论】:

    标签: java swing printing jbutton


    【解决方案1】:

    你可以通过简单的方式创建一个按钮:

     import javax.swing.*;
     ....
     JButton button = new JButton("Print");
    

    然后在按钮上添加ActionListener

    import java.awt.*;
    ....
    button.addActionListener(new ActionListener() {
                @override
                public void actionPerformed(ActionEvent e)
                {
                    //Execute when button is pressed
                    printPDF("path/to/file/.pdf");
                }
            });   
    

    然后要打印 PDF,您可以使用此方法:

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import javax.print.*;
    import javax.print.attribute.HashPrintRequestAttributeSet;
    import javax.print.attribute.PrintRequestAttributeSet;
    ....
    public static void printPDF(String file) {
    
        FileInputStream psStream = null;
        try {
            psStream = new FileInputStream(file);
        } catch (FileNotFoundException ffne) {
            ffne.printStackTrace();
        }
        if (psStream == null) {
            return;
        }
        DocFlavor psInFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset);
    
        // this step is necessary because I have several printers configured  
        PrintService myPrinter = null;
        for (int i = 0; i < services.length; i++) {
            String svcName = services[i].toString();
            System.out.println("service found: " + svcName);
            if (svcName.contains("printer closest to me")) {
                myPrinter = services[i];
                System.out.println("my printer found: " + svcName);
                break;
            }
        }
        if (myPrinter != null) {
            DocPrintJob job = myPrinter.createPrintJob();
            try {
                job.print(myDoc, aset);
    
            } catch (Exception pe) {
                pe.printStackTrace();
            }
        } else {
            System.out.println("no printer services found");
        }
    }
    

    附录:

    • 要在可能没有“离我最近的打印机”的特定打印机上进行这项工作: 更改此代码以包含您的打印机名称,或分别使用 contains()equals() 的确切打印机名称:

      String printerName="";
      ....
      if (svcName.contains(printerName)||svcName.equals(printerName)) {
                          myPrinter = services[i];
                          System.out.println("my printer found: " + svcName);
                          break;
      }
      

    参考资料:

    【讨论】:

    • 唯一的问题是,您已经定义了文件的路径,但在我的情况下,单击导出按钮时会立即生成 pdf,所以我应该如何定义 pdf 的位置或更确切地说它的位置?有没有办法可以说应该打印生成的输出(pdf)?
    • 什么意思?为什么不直接在临时位置创建并保存 PDF,打印(使用临时位置)并在打印完成后删除临时文件?
    • 另外,我刚刚创建了 PDF 类,但它的下划线 svcName 表示 svcName 无法解析为变量。你能解释一下我应该如何解决这个问题吗?
    • @Priya 这篇文章很有帮助:Printing in Java
    • @Priya 编辑代码查看编辑代码,只需要更改printlnsvcName 分配的顺序
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多