2013-05-20 8 views
34

Używam Spring MVC. Muszę napisać usługę, która pobierze dane z treści żądania, doda dane do pliku pdf i zwróci plik pdf do przeglądarki. Dokument PDF jest generowany za pomocą itextpdf. Jak to zrobić, używając Spring MVC. Próbowałem używać tej funkcji showhelp, która generuje plik pdf. Właśnie umieszczam losowe dane w pliku pdf.Zwróć wygenerowany pdf za pomocą sprężyny MVC

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

Jestem pewien, że to jest złe. Chcę, aby ten plik PDF był generowany, a okno dialogowe zapisywania/otwierania otwierane przez przeglądarkę, aby mogło być przechowywane w systemie plików klienta. Proszę pomóż mi.

Odpowiedz

68

Jesteś na dobrej drodze z response.getOutputStream(), ale nie korzystasz z jego danych wyjściowych w dowolnym miejscu kodu. Zasadniczo musisz przesłać strumieniowo bajty pliku PDF bezpośrednio do strumienia wyjściowego i przepłukać odpowiedź. Wiosną można zrobić to tak:

@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.parseMediaType("application/pdf")); 
    String filename = "output.pdf"; 
    headers.setContentDispositionFormData(filename, filename); 
    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); 
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK); 
    return response; 
} 

Uwagi:

  • stosować nazwy dla Twoich metod: nazywanie metodę, która zapisuje dokument PDF showHelp jest nie dobrym pomysłem
  • czytanie pliku w postaci byte[]: example here
  • Proponuję dodanie losowego ciągu znaków do tymczasowej nazwy pliku PDF wewnątrz showHelp(), aby uniknąć nadpisanie pliku, jeśli dwóch użytkowników wysłało żądanie w tym samym czasie:
+0

To mi pomogło. Wielkie dzięki!!! Mam jeszcze jeden. tutaj przechowuję wygenerowany plik pdf do mojego systemu plików, a następnie odczytuję go i konwertuję na bajty. Co powinienem zrobić, jeśli muszę konwertować wygenerowany plik pdf w drodze. Z góry dzięki –

+4

Zamiast używać 'FileOutputStream' w twoim' PdfWriter.getInstance() 'możesz użyć' ByteArrayOutputStream'. – kryger

+0

@kryger, czy wiesz, jak otworzyć plik PDF w oknie przeglądarki? Użyłem twojej metody i zachęcam użytkownika do natychmiastowego zapisania pliku :) –

Powiązane problemy