2013-05-20 2 views
34

Spring MVC를 사용하고 있습니다. 요청 본문에서 입력을 받아서 pdf에 데이터를 추가하고 브라우저에 pdf 파일을 반환하는 서비스를 작성해야합니다. pdf 문서는 itextpdf를 사용하여 생성됩니다. Spring MVC를 사용하여 어떻게 할 수 있습니까? 나는 이걸 사용해 보았습니다봄 MVC를 사용하여 생성 된 PDF를 반환합니다.

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

pdf를 생성하는 showhelp 기능. 나는 당분간 pdf에 임의의 데이터를 넣을 뿐이다.

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

나는 틀렸을 것입니다. 그 pdf를 생성하고 브라우저를 통해 저장/열기 대화 상자를 열어 클라이언트의 파일 시스템에 저장할 수있게하려고합니다. 제발 도와주세요.

답변

68

올바른 트랙에 response.getOutputStream()으로 있었지만 코드의 아무 곳에서나 출력을 사용하고있는 것은 아닙니다. 기본적으로 PDF 파일의 바이트를 출력 스트림으로 직접 스트리밍하고 응답을 플러시하는 것이 필요합니다. 봄에서 당신은 이런 식으로 작업을 수행 할 수 있습니다

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

주 : 당신의 방법에 대한

  • 사용 의미있는 이름 : PDF 문서를 작성하는 방법을 명명 showHelp하지 좋은 생각
  • 입니다 byte[]에 파일 읽기 : 예 here
  • 임시 파일 이름에 임의의 문자열을 추가하여 showHelp()을 피하는 것이 좋습니다. 두 명의 사용자가 동시에 요청을 보내면 파일을 수정합니다.
+0

나를 도왔습니다. 고마워요 !!! 나는 한 명 더있다. 여기에 생성 된 PDF 파일을 내 파일 시스템에 저장하고 읽은 다음 바이트로 변환합니다. 이동 중에 생성 된 PDF를 변환해야한다면 어떻게해야합니까? 미리 감사드립니다 –

+4

'PdfWriter.getInstance()'에서'FileOutputStream'을 사용하는 대신'ByteArrayOutputStream'을 사용할 수 있습니다. – kryger

+0

@kryger, 브라우저 창에서 PDF 파일을 여는 방법을 알고 있습니까? 나는 당신의 방법을 사용했고 나는 즉시 파일을 저장하라는 메시지를 표시했다. –

관련 문제