Japserレポートを含むPDFを生成しています。このPDFを返し、ブラウザで表示するREST Webサービスを作成したいと思います。
ブラウザでPDFファイルを表示するためのREST Webサービスメソッド
しかし、この方法でpdfファイルがダウンロードされます。最初にブラウザに表示してから、ユーザーが必要に応じて後でダウンロードできるようにすることをお勧めします。
(重複した質問は申し訳ありませんが、ご覧のとおり、上記の質問には回答されていません...)
編集:
作業中RESTサービスコード:
@GET
@Path("/pdf")
@Produces("application/pdf")
public javax.ws.rs.core.Response getPdf() throws Exception
{
File file = new File("E:\\tmp\\test.pdf");
FileInputStream fileInputStream = new FileInputStream(file);
javax.ws.rs.core.Response.ResponseBuilder responseBuilder = javax.ws.rs.core.Response.ok((Object) fileInputStream);
responseBuilder.type("application/pdf");
responseBuilder.header("Content-Disposition", "filename=test.pdf");
return responseBuilder.build();
}
変化する
response.header("Content-Disposition", "attachment; filename=restfile.pdf");
に
response.header("Content-Disposition", "filename=restfile.pdf");
まずInputStreamを使用して、ファイルをinputstreamにロードし、次にIOUtils.copyに渡して、これを使用しますresponse.header("Content-Disposition", "attachment; filename=restfile.pdf")
forダウンロード、これを使用しますプレビュー用response.setHeader("Content-disposition", " filename=" + output)
InputStream inputStream = new FileInputStream(new File(path)); // load the file
IOUtils.copy(inputStream, response.getOutputStream());
response.setContentType("application/pdf");
response.setHeader("Content-disposition", " filename=" + output);
response.flushBuffer();
メソッドの戻り型は `ResponseEntityです
JasperReportsViewResolver で簡単にできます。データソースが定義されていると仮定して、次のようなBean定義を作成します。
@Autowired
private DataSource dataSource;
@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() {
JasperReportsViewResolver resolver = new JasperReportsViewResolver();
resolver.setPrefix("classpath:/reports/");
resolver.setSuffix(".jrxml");
resolver.setJdbcDataSource(dataSource);
resolver.setViewNames("rpt_*");
resolver.setViewClass(JasperReportsMultiFormatView.class);
resolver.setOrder(0);
return resolver;
}
レポートは/reports/
ディレクトリにあり、レポートはプレフィックスrpt_
で始まります。したがって、reports
フォルダーにJRXML
ファイルを配置します。
そして、リクエストのマッピング方法は次のようになります:
@RequestMapping(value = "/report", method = RequestMethod.GET)
public ModelAndView showReport() {
ModelMap modelMap = new ModelMap();
modelMap.put("format", "pdf");
ModelAndView modelAndView = new ModelAndView("rpt_myReport", modelMap);
return modelAndView;
}
基本的に、レポートを別のビューのように脅かすことができます。ファイルは新しいタブで開き、ダウンロード、印刷などができます。
@Branislav Lazicの例に従って、私が見つけた方法は@Autowired
レポートコントローラーのJasperReportsViewResolver
:
@Autowired
private JasperReportsViewResolver jrvr;
そして、ヘッダーのプロパティをオーバーライド(または更新)"Content-Disposition"
。例えば:
...
final Properties properties = new Properties();
properties.setProperty("Content-Disposition", "attachment; filename=newReportName.xlsx");
jrvr.setHeaders(properties);
...
その最善の方法かどうかはわかりませんが、私にとってはうまくいきます。