JasperReportを使用してレポートをPDFにエクスポートしています。コードは正常に実行され、例外メッセージはコンソール/ログに表示されません。ただし、レポートはブラウザにエクスポートされません。言い換えれば、レポートが作成されていて、私はそれをダウンロードしたりアクセスしたりすることができません。ここでOutputStreamがPDFにエクスポートされていないJasperReport
は輸出コードです:
public void generatePDFReport(Map<String, Object> parameters, JRDataSource jrDataSource, String resource, String filename)
{
OutputStream os = null;
try{
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
os = response.getOutputStream();
InputStream reportTemplate = this.getClass().getClassLoader().getResourceAsStream(resource);
byte[] pdf = null;
try {
JasperDesign masterDesign = JRXmlLoader.load(reportTemplate);
masterReport = JasperCompileManager.compileReport(masterDesign);
masterReport.setWhenNoDataType(WhenNoDataTypeEnum.ALL_SECTIONS_NO_DETAIL);
JasperPrint masterPrint = JasperFillManager.fillReport(masterReport, parameters, jrDataSource);
pdf = JasperExportManager.exportReportToPdf(masterPrint);
} catch (JRException e) {
log.error(e);
}
response.setContentType("application/pdf");
response.setContentLength(pdf.length);
response.setHeader("Content-disposition", "attachment; filename=\""+filename+"\"");
context.responseComplete();
os.write(pdf);
pdf = null;
}catch(Exception e){
log.error(e);
}finally{
try{
os.flush();
os.close();
}catch(IOException e){
log.error(e);
}
}
}
私はそれが別のレポートのために正常に動作ようなコードは何も問題がないことをほぼ100%確信しています(私はいくつかの他のレポートに同じ輸出コードを実行し、これを除いてすべて期待どおりに動作します)。
これを知って、私はそれがレポート自体と関係があると考えました。このレポートはjrxml JasperReportファイルです。レポートはiReportを使用して作成されました。しかし、私は上記のコードをダウンロードフォルダに保存するだけで、レポートは完全にうまく作成されています。
問題は、レポートがバックエンドで正常に作成されていても、期待通りにフロントエンド(ブラウザ)に送信されていないことです。
このレポートが機能しない理由については、私は何の示唆もありません。
私はpdf = nullが好きではありません。ストリーミングするときに書き込みを行い、最後に移動し、さらにいくつかのログを追加してbyte.size eccを取得します.Jasperレポートタグの属性として設定できるWhenNoDataType、 Javaで設定する必要はありません。 –
@PetterFriberg pdf = nullをコメントアウトすると、目に見える効果はありません。まだ動作していません。 byte.sizeに関しては、このレポートのために約7900バイトです。私はレポートが作成され、正常に移入されたと信じています。何か案は? – AntonioK
@DaveJarvis '.jasper'ファイルを直接実行することは役に立ちませんでした。私は同じ問題を抱えています。他のアイデア? – AntonioK