Просмотр pdf в браузере с помощью службы отдыха

Я создаю pdf с отчетами о japser, и я хотел бы создать веб-службу REST, которая вернет этот PDF файл и отобразит его в браузере. Я уже пробовал код, отображаемый здесь:

Метод веб-служб REST для отображения pdf файла в браузере

Но таким образом загружается файл PDF. Я бы предпочел, чтобы он отображался в браузере первым, а затем, если пользователь хочет, чтобы он мог его загрузить позже.

(извините за дублированный вопрос, но, как вы видите, этот вопрос не ответил...)

EDIT:

Рабочий код службы 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();
}

Ответ 1

изменить

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

to

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

Ответ 2

Сначала используя InputStream, мы можем загрузить файл во входной поток, а затем перейти к IOUtils.copy и использовать этот response.header("Content-Disposition", "attachment; filename=restfile.pdf") для загрузки, использовать этот для предварительного просмотра 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

Ответ 3

Вы можете легко сделать это с помощью 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;
}

Вы можете в основном угрожать вашему отчету, как просто другому представлению. Файл будет открыт на новой вкладке с возможностью его загрузки, печати и т.д.

Ответ 4

Следуя примеру @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);
...

Я не знаю, лучший ли он, но отлично работает для меня.