当前位置: 首页 > 面试题库 >

从JasperReports打印PDF

长孙鸿波
2023-03-14
问题内容

我是JasperReports的新手,发现自己迷失了它。我在JSF中有一个webapp,我想用它来打印PDF。我已经建立了报告,并且能够成功地编译并使用我的所有参数填充它。但是,我不了解实际的输出部分。我希望它以PDF格式发送到打印机。我根本不在乎在屏幕上看到它,直接到打印机是理想的选择(从服务器是理想的选择,但是客户端也可以,因为我们可以根据需要设置客户端进行打印(这是一个内部应用程序))


问题答案:

我希望它以PDF格式发送到打印机。 我不在乎在屏幕上看到它,直接到达打印机将是理想的选择

您不能使用纯HTML / CSS / JS来实现。由于JSF基本上只是HTML / CSS /
JS代码生成器,因此它无法为您做任何魔术。您能获得的最接近的是JavaScript的window.print(),但仍会向用户显示打印机设置等(基本上,它的作用与相同Ctrl+P)。

最好的选择是创建一个使用该API的Applet,然后通过HTML
标签将该Applet嵌入到您的JSF页面中。javax.print<applet>``<object>

如果您 可以 直接在屏幕上看到它并将打印作业委托给最终用户自己,那么可以通过JSF将PDF文件发送到屏幕,如下所示:

public void sendPdf() throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/pdf");
    externalContext.setResponseHeader("Content-Disposition", "inline; filename=\"filename.pdf\"");
    yourJasperReportsClass.writePdfTo(externalContext.getResponseOutputStream());
    facesContext.responseComplete();
}

我从未使用过JasperReports,所以这yourJasperReportsClass.writePdfTo()只是一个随机的猜测,但提示应该足够清楚。基本上,您需要指示它将PDF写入响应正文。

更新
:根据注释,该打印机实际上是连接到服务器而不是客户端,并且您实际上是想让服务器将其打印到其打印机。在这种情况下,只要使用的javax.printAPI。在该文档的底部,您可以找到一些代码示例。这是相关的摘录:

使用API

使用Java Print Service API的典型应用程序执行以下步骤来处理打印请求:

  • 选择一个DocFlavor。
  • 创建一组属性。
  • 找到可以处理DocFlavor和属性集指定的打印请求的打印服务。
  • 创建一个封装DocFlavor和实际打印数据的Doc对象,该对象可以采用多种形式,包括:Postscript文件,JPEG图像,URL或纯文本。
  • 从打印服务获取由DocPrintJob表示的打印作业。
  • 调用打印作业的打印方法。

下面的代码示例演示了Java Print Service
API的典型用法:查找可以在A4尺寸的纸张上打印Postscript文档的五个双面副本的打印机,从返回的打印服务之一创建打印作业,并调用print。

FileInputStream psStream;

try {
  psStream = new FileInputStream("file.ps");
} catch (FileNotFoundException ffne) {
}

if (psStream == null) {
  return;
}

DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT;
Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(5));
aset.add(MediaSize.A4);
aset.add(Sides.DUPLEX);

PrintService[] services =

PrintServiceLookup.lookupPrintServices(psInFormat, aset); >
if (services.length > 0) {
DocPrintJob job = services[0].createPrintJob();

  try {
    job.print(myDoc, aset);
  } catch (PrintException pe) {
  }
}

如果上述代码由JSF托管bean调用,则无关紧要。毕竟只是Java。您可能只想修改DocFlavor和其他设置。



 类似资料:
  • 主要内容:1 查看JasperReports JRPrint文件,2 打印JasperReports的报表1 查看JasperReports JRPrint文件 上一章:《JasperReports 填充报表》,我们已经通过JasperReports生成了.jrprint报表文件,接下来我们可以编写预览程序来预览.jrpirnt文件的效果。 输出结果如下: 2 打印JasperReports的报表 我们可以使用net.sf.jasperreports.engine.JasperPrintMana

  • 我们希望打印到连接在apache运行的POS打印机上。由于应用程序的设计和部署,打印应该从服务器上完成(它应该检测订单并发送到不同的打印机和不同格式的打印...账单,厨房订单,等等...)。出于这个原因和其他原因(例如,从iPad访问应用程序),我们放弃了像QZ-Print applet这样的选项,并需要直接在服务器端打印。 提前谢了。

  • 我在JasperReports服务器上遇到了一些问题。我需要直接在服务器上打印报表。 我先查看报表,然后单击打印,就会打开打印机对话框。选择打印机后,我也可以打印报告。有什么想法吗?

  • 问题内容: 我已经开发了用于报告目的的Web应用程序。为此,我必须使用Applet在客户端查看报告。我通常可以在applet中看到报表,但是当涉及到打印时(当我单击Viewer中的“打印”按钮时),它将引发一个异常,该异常可以在Java Console中看到。我浏览了很多有关此问题的内容,并做了网上专家建议的一切。我将用作网站服务器时,在文件中添加了授予权限。此外,还向我的applet添加了授予权

  • 问题内容: 我正在建立HTML格式的PDF清单。在列表中,我想包含一个下载链接和一个打印按钮/链接。有什么方法可以直接打开PDF的“打印”对话框,而无需用户查看PDF或打开PDF查看器? 将PDF下载到隐藏的iframe中并触发使用JavaScript进行打印,这有一些变化吗? 问题答案: 根据以下评论,它不再可在现代浏览器中使用。 该问题演示了一种可能对您有所帮助的方法:静默打印嵌入式PDF 它

  • 问题内容: 我正在为具有内置行式打印机的Android设备开发应用程序。我必须与此打印机进行交互,并使用它来打印收据上的详细信息,然后使用裁纸器自动剪切该收据。我已经在其中看到了一些ESC命令,但是我不知道如何执行这些ESC命令。 关于Casio设备打印机,我有三个主要问题: 1.我已经使用了内置打印机的打印代码,但是打印后切纸刀没有激活 2.我不知道如何在android中将ESC命令发送到打印机