web-dev-qa-db-ja.com

レストサービスを使用してブラウザーでPDFを表示する

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();
}
22
jenny

変化する

response.header("Content-Disposition",  "attachment; filename=restfile.pdf");

response.header("Content-Disposition",  "filename=restfile.pdf");
25

まず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です

2
chandrashekar.n

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;
}

基本的に、レポートを別のビューのように脅かすことができます。ファイルは新しいタブで開き、ダウンロード、印刷などができます。

0
Branislav Lazic

@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);
...

その最善の方法かどうかはわかりませんが、私にとってはうまくいきます。

0
JoseAlv