programing

스프링 MVC를 사용하여 생성된 PDF 반환

goodsources 2023. 2. 25. 20:57
반응형

스프링 MVC를 사용하여 생성된 PDF 반환

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

@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를 생성하고 저장/열기 대화 상자를 브라우저를 통해 열어 클라이언트의 파일 시스템에 저장했으면 합니다.제발 도와주세요.

당신은 올바른 방향으로 나아가고 있었어요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.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;
}

주의:

  • 메서드에 의미 있는 이름 사용: PDF 문서를 작성하는 메서드 이름 지정showHelp좋은 생각이 아니다
  • 파일 읽기byte[]: 예: 여기
  • 임시 PDF 파일 이름에 임의의 문자열을 추가하는 것이 좋습니다.showHelp()두 사용자가 동시에 요청을 보내는 경우 파일을 덮어쓰지 않도록 하려면

언급URL : https://stackoverflow.com/questions/16652760/return-generated-pdf-using-spring-mvc

반응형