Ich benutze Spring MVC. Ich muss einen Dienst schreiben, der Eingaben vom Anfragetext entgegennimmt, die Daten zum PDF hinzufügt und die PDF-Datei an den Browser zurücksendet. Das PDF-Dokument wird mit itextpdf erstellt. Wie kann ich das mit Spring MVC machen? Ich habe es versucht
@RequestMapping(value="/getpdf", method=RequestMethod.POST)
public Document getPDF(HttpServletRequest request , HttpServletResponse response,
@RequestBody String json) throws Exception {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment:filename=report.pdf");
OutputStream out = response.getOutputStream();
Document doc = PdfUtil.showHelp(emp);
return doc;
}
showHelp-Funktion, die das PDF generiert. Ich füge vorerst nur einige zufällige Daten in das PDF ein.
public static Document showHelp(Employee emp) throws Exception {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("C:/tmp/report.pdf"));
document.open();
document.add(new Paragraph("table"));
document.add(new Paragraph(new Date().toString()));
PdfPTable table=new PdfPTable(2);
PdfPCell cell = new PdfPCell (new Paragraph ("table"));
cell.setColspan (2);
cell.setHorizontalAlignment (Element.ALIGN_CENTER);
cell.setPadding (10.0f);
cell.setBackgroundColor (new BaseColor (140, 221, 8));
table.addCell(cell);
ArrayList<String[]> row=new ArrayList<String[]>();
String[] data=new String[2];
data[0]="1";
data[1]="2";
String[] data1=new String[2];
data1[0]="3";
data1[1]="4";
row.add(data);
row.add(data1);
for(int i=0;i<row.size();i++) {
String[] cols=row.get(i);
for(int j=0;j<cols.length;j++){
table.addCell(cols[j]);
}
}
document.add(table);
document.close();
return document;
}
Ich bin sicher, das ist falsch. Ich möchte, dass das PDF-Dokument generiert und das Dialogfeld "Speichern/Öffnen" über den Browser geöffnet wird, damit es im Dateisystem des Clients gespeichert werden kann. Bitte hilf mir.
Sie waren mit response.getOutputStream()
auf dem richtigen Weg, aber Sie verwenden die Ausgabe nirgendwo in Ihrem Code. Im Wesentlichen müssen Sie die Bytes der PDF Datei direkt in den Ausgabestream streamen und die Antwort leeren. Im Frühjahr können Sie dies folgendermaßen tun:
@RequestMapping(value="/getpdf", method=RequestMethod.POST)
public ResponseEntity<byte[]> getPDF(@RequestBody String json) {
// convert JSON to Employee
Employee emp = convertSomehow(json);
// generate the file
PdfUtil.showHelp(emp);
// retrieve contents of "C:/tmp/report.pdf" that were written in showHelp
byte[] contents = (...);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_PDF);
// Here you have to set the actual filename of your pdf
String filename = "output.pdf";
headers.setContentDispositionFormData(filename, filename);
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<>(contents, headers, HttpStatus.OK);
return response;
}
Anmerkungen:
showHelp
schreibt, ist nicht eine gute Ideebyte[]
: Beispiel hiershowHelp()
eine zufällige Zeichenfolge hinzuzufügen, um zu vermeiden, dass die Datei überschrieben wird, wenn zwei Benutzer gleichzeitig eine Anforderung senden