webentwicklung-frage-antwort-db.com.de

Zeigen Sie das PDF im Browser mit einem Rest-Service an

Ich generiere ein PDF mit Japser-Berichten und möchte einen REST Web-Service erstellen, der dieses PDF zurückgibt und im Browser anzeigt. Ich habe den hier angezeigten Code bereits ausprobiert:

REST Webservices-Methode zur Anzeige von PDF-Dateien im Browser

Auf diese Weise wird die PDF-Datei heruntergeladen. Ich würde es vorziehen, wenn es zuerst im Browser angezeigt wird und dann, wenn der Benutzer möchte, dass er es später herunterladen könnte.

(Entschuldigung für die doppelte Frage, aber wie Sie sehen können, wurde die obige Frage nicht beantwortet ...)

EDIT:

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

veränderung 

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

zu 

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

Mit InputStream können wir die Datei zuerst in inputstream laden, dann an IOUtils.copy übergeben und diese response.header("Content-Disposition", "attachment; filename=restfile.pdf") zum Download verwenden, diese für die Vorschau 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();

Rückgabetyp der Methode ist `ResponseEntity

2
chandrashekar.n

Das geht ganz einfach mit JasperReportsViewResolver . Vorausgesetzt, Sie haben eine Datenquelle definiert, erstellen Sie eine Bean-Definition wie folgt:

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

Ihre Berichte befinden sich im Verzeichnis /reports/ und Ihre Berichte beginnen mit dem Präfix rpt_. Im Ordner reports legen Sie Ihre JRXML-Dateien ab.

Und Ihre Anforderungsmapping-Methode sieht folgendermaßen aus:

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

Sie können Ihren Bericht grundsätzlich wie eine andere Ansicht bedrohen. Die Datei wird in einem neuen Tab geöffnet und kann heruntergeladen, gedruckt usw. werden.

0
Branislav Lazic

Nach dem Beispiel von @Branislav Lazic habe ich festgestellt, dass @Autowired die JasperReportsViewResolver in Ihrem Report Controller ist: 

@Autowired
private JasperReportsViewResolver jrvr;

Und überschreiben (oder aktualisieren) Sie die Header-Eigenschaft "Content-Disposition". Zum Beispiel:

...
final Properties properties = new Properties();
properties.setProperty("Content-Disposition", "attachment; filename=newReportName.xlsx");
jrvr.setHeaders(properties);
...

Ich weiß nicht, ob es der beste Weg ist, aber es funktioniert gut für mich.

0
JoseAlv