Friday, October 10, 2014

Creating PDF in spring MVC

Maven Dependency :

Add following dependency in your pom.xml 
        
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.3.4</version>
        </dependency>


Controller code :

    @RequestMapping(value = "/generatePDF/{empId}",method = RequestMethod.GET)
    private void downloadPDF(@PathVariable Integer empId,
                                    HttpServletResponse response,
                                    HttpServletRequest request, ModelMap model) 
                                    throws IOException {
        
        List<TaskEntry> taskEntryList =  taskEntryService.retrieveAllTask(empId);\
       //here TaskEntry is your Domain of respective class
       //here taskEntryService is your service layer from which you are accessing Data.
       String orignalFileName="sample.pdf";

        try {
            Document document = new Document();
            response.setHeader("Content-Disposition", "outline;filename=\"" +orignalFileName+ "\"");
            PdfWriter.getInstance(document, response.getOutputStream());

            document.open();
            document.add(createFirstTable(taskEntryList ));
            document.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }






public PdfPTable createFirstTable(List<TaskEntry> taskEntryList ) throws ParseException {
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        String fromDate=sdf.format(pdfForm.getFromDate());
        String toDate=sdf.format(pdfForm.getToDate());
        // a table with three columns
        PdfPTable table = new PdfPTable(2);
        // the cell object
        PdfPCell cell;
        // we add a cell with colspan 3
        cell = new PdfPCell(new Phrase("TASK DETAILS"));
        cell.setColspan(2);
        table.addCell(cell);
        cell = new PdfPCell(new Phrase("From"+fromDate+"TO"+toDate));
        cell.setColspan(2);
        table.addCell(cell);
        table.addCell("DATE:");
        table.addCell("TASK:");
        for(TaskEntry taskEntry: taskEntryList)  
       {
           table.addCell(taskEntry.task);
        }
        return table;
    }


Return generated pdf using spring MVC


I am using Spring MVC .I have to write a service that would take input from the request body, add the data to the pdf and returns the pdf file to the browser. The pdf document is generated using itextpdf. How can I do this using Spring MVC. I have tried using this
@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 function that generates the pdf. I am just putting some random data in the pdf for time being.
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;   
    } 
I am sure this is wrong. I want that pdf to be generated and save/open dialog box to be opened through the browser, so that it can be stored in the client's file system. Please help me out.



accepted
You were on the good track with that response.getOutputStream(), but you're not using it in your code. Essentially what you need to do is to stream the PDF file's bytes directly to the output stream and flush the response. In Spring you can do this like this:
@RequestMapping(value="/getpdf", method=RequestMethod.POST)
public ResponseEntity<byte[]> getPDF(@RequestBody String json) {
    // json => emp
    (...)

    // generate the file
    PdfUtil.showHelp(emp);

    // retrieve contents of "C:/tmp/report.pdf"
    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;
}
Notes:
  • reading a file into a byte[]: example here
  • I'd suggest adding a random string to the temporary PDF file name inside showHelp() to avoid overwriting the file if two users send a request at the same time

1 comment:

  1. Thanks for sharing this informative content , Great work
    Leanpitch provides online training in Product prototyping during this lockdown period everyone can use it wisely.
    icp-cat training

    ReplyDelete

Java 9 and Java11 and Java17, Java 21 Features

 Java 9 and Java11 and Java17 features along with explanation and examples in realtime scenarios Here's a detailed breakdown of Java 9, ...