从JasperReports打印PDF

时间:2011-11-03 18:05:41

标签: java jsf java-ee jasper-reports

我是JasperReports的新手,发现自己迷失了。我在JSF中有一个webapp,我想用它来打印PDF。我已经构建了报告,并且能够使用我的所有参数成功编译并填充它。但是,我在实际输出部分丢失了。我希望它以PDF格式打印机。我不关心在屏幕上看到它,直接打印机将是理想的(从服务器将是理想的,但客户端也会很好,因为我们可以设置客户端打印必要(它是一个内部应用程序))

1 个答案:

答案 0 :(得分:4)

  

我希望它以PDF格式打印机。我不关心在屏幕上看到它,直接打印机将是理想的

使用纯HTML / CSS / JS无法做到这一点。由于JSF基本上只是一个HTML / CSS / JS代码生成器,它不能为你做任何魔术。最接近的是JavaScript的window.print(),但这仍然会向用户显示打印机设置等(基本上,它与Ctrl+P相同)。

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

如果您可以直接在屏幕上看到它并将打印作业委托给最终用户本身,那么您可以通过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写入响应正文。


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

  

使用API​​

     

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

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

以下代码示例演示了Java Print Service API的典型用法:找到可以在A4纸上打印5张Postscript文档双面副本的打印机,从其中一个返回的打印服务创建打印作业,以及打印。

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和其他设置。