2014-12-13 1258 views
-2

我正在做一個項目,我需要爲出現在考試中的學生創建一張錄取卡。 PDF生成部分工作正常,但我的問題是我必須將我的PDF編碼爲Base64格式。我沒有找到任何解決方案。我的代碼是作爲波紋管如何將在response.outputStream中生成的PDF轉換爲Base64編碼

public void downloadPdf() throws IOException, DocumentException { 
      System.out.println("hi i ma in");  
      resultList=examinationDetailsService.readAdmitCardData(); 

      for(Object[] data:resultList) 
      { 
       personalDetails=(PersonalDetails)data[0]; 
       System.out.println("name"+personalDetails.getApplicantName()); 
       rollNoAssign=(RollNoAssign)data[1]; 
       System.out.println("rollno"+rollNoAssign.getRollNo()); 
       examDateAssign=(ExamDateAssign)data[2]; 
      } 
      //Converting Date 
      SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy"); 
      String date = DATE_FORMAT.format(examDateAssign.getExaminationDate()); 
      // Get the FacesContext 
      FacesContext facesContext = FacesContext.getCurrentInstance(); 
      // Get HTTP response 
      HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); 
      // Set response headers 
      response.reset(); // Reset the response in the first place 
      response.setHeader("Content-Type", "application/pdf"); // Set only the content type 
      // Open response output stream 
      OutputStream responseOutputStream = response.getOutputStream(); 

      Document document = new Document(PageSize.A4, 0, 0, 0, 0); 
      PdfWriter.getInstance(document,response.getOutputStream()); 
      document.open(); 
      PdfPTable maintable = new PdfPTable(1); 
      maintable.setWidthPercentage(90); 
      maintable.setSpacingBefore(0f); 
      maintable.setSpacingAfter(0f); 
      Paragraph ph1 = new Paragraph(); 
      ph1.add(new Chunk("\n\nGOVERNMENT OF ASSAM \nOFFICE OF THE ELECTRICAL LICENSING BOARD, ASSAM\n1", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.NORMAL))); 
      //ph1.add(new Chunk("ST", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.NORMAL))); 
      Chunk superScript = new Chunk("ST", FontFactory.getFont(FontFactory.TIMES_ROMAN, 8, Font.NORMAL)); 
      superScript.setTextRise(5f); 
      ph1.add(superScript); 
      ph1.add(new Chunk(" FLOOR, WEST END BLOCK, HOUSEFED COMPLEX,DISPUR, GUWAHATI-781006, ASSAM.", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.NORMAL))); 
      ph1.add(new Chunk("\n***\n", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD))); 
      ph1.add(new Chunk("\nADMIT CARD", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD))); 

      PdfPCell heading1 = new PdfPCell(ph1); 
      heading1.setBorder(0); 
      heading1.setHorizontalAlignment(Element.ALIGN_CENTER); 
      heading1.setVerticalAlignment(Element.ALIGN_CENTER); 
      maintable.addCell(heading1); 

      PdfPTable maintable1 = new PdfPTable(1); 
      maintable1.setWidthPercentage(87); 
      maintable1.setSpacingBefore(0f); 
      maintable1.setSpacingAfter(0f); 

      Paragraph ph2 = new Paragraph(); 
      ph2.add(new Chunk("\n\nShri/Smti "+personalDetails.getApplicantName()+", Roll No. "+rollNoAssign.getRollNo()+" is hereby " 
        + "allowed to appear in the examination for grant of Electrical Supervisor's Certificate of Competency " 
        + "to be held at "+ rollNoAssign.getVenue().getName() 
        + "as per schedule given below:", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.NORMAL))); 
      ph2.add(new Chunk("\n\n   Viva-voce", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.BOLD))); 
      ph2.add(new Chunk(" test on "+date+ " at 9 AM/12.30 PM ;", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.NORMAL))); 
      ph2.add(new Chunk(" Written", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.BOLD))); 
      ph2.add(new Chunk(" test on __________ at 9 AM.", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.NORMAL))); 
      ph2.add(new Chunk("\n\n\nPlease bring the followings with you while coming for the said examinations:        \n" 
        + "\n1.Original copy of Degree/Diploma/ITI Certificate/Supervisor's Certificate of Competency/" 
        + "Workmen's Permit\n\n belonging to you and this Admit Card in original.\n" 
        + "\n2.Detail experience certificate(s) relevant to the part(s) of Supervisor's examination applied for.\n" 
        + "\n3.\n" 
        + "\n\nNB: (a) No alteration is allowed in the entries on this Admit Card without the authority of the Board." 
        + "\n   (b) No expense(s) incurred by any candidate will be borne by the Board.\n\n\n", FontFactory.getFont(FontFactory.TIMES_ROMAN, 11, Font.NORMAL))); 
      PdfPCell heading2 = new PdfPCell(ph2); 
      heading2.setBorder(0); 
      heading2.setHorizontalAlignment(Element.ALIGN_JUSTIFIED); 
      heading2.setVerticalAlignment(Element.ALIGN_CENTER); 
      maintable1.addCell(heading2); 

      PdfPTable maintable2 = new PdfPTable(2); 
      float[] columnWidths = new float[]{55f, 45f}; 
      maintable2.setWidths(columnWidths); 
      maintable2.setWidthPercentage(84); 
      maintable2.setSpacingBefore(0f); 
      maintable2.setSpacingAfter(0f); 

      Paragraph ph31 = new Paragraph(); 
      ph31.add(new Chunk("Details furnished by you in the application form and/or examination process are used by the Board" 
        + " for further needful, hence, if you feel any correction(s) in the same is/are required, please get those done before" 
        + " leaving the examination venue. The Board shall not be under any obligation of removing the difficulties arising later" 
        + " on out of incorrect/improper information furnished by you or non-furnishing of required ones.\n", FontFactory.getFont(FontFactory.COURIER, 10, Font.NORMAL))); 
      PdfPCell heading31 = new PdfPCell(ph31); 
      heading31.setBorder(15); 
      heading31.setHorizontalAlignment(Element.ALIGN_JUSTIFIED); 
      heading31.setVerticalAlignment(Element.ALIGN_LEFT); 

      maintable2.addCell(heading31); 

      Paragraph ph32 = new Paragraph(); 
      ph32.add(new Chunk("\n\n\n(Member Secretary)\nElectrical Licensing Board,\nAssam.", FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.NORMAL))); 
      PdfPCell heading32 = new PdfPCell(ph32); 
      heading32.setBorder(0); 
      heading32.setHorizontalAlignment(Element.ALIGN_CENTER); 
      heading32.setVerticalAlignment(Element.ALIGN_CENTER); 
      maintable2.addCell(heading32); 

      document.add(maintable); 
      document.add(maintable1); 
      document.add(maintable2); 
      document.close(); 

      /* // Read PDF contents 
      URL url = new URL(PDF_URL); 
      InputStream pdfInputStream = url.openStream();*/ 

      // Read PDF contents and write them to the output 
      byte[] bytesBuffer = new byte[2048]; 
      int bytesRead; 
      /* while ((bytesRead = pdfInputStream.read(bytesBuffer)) > 0) { 
       responseOutputStream.write(bytesBuffer, 0, bytesRead); 
      } 
      */ 
      Base64 encoder = new Base64(); 
      byte[] decodedBytes = encoder.o 

      // Make sure that everything is out 
      responseOutputStream.write(decodedBytes); 
      responseOutputStream.flush(); 

      // Close both streams 
      //pdfInputStream.close(); 
      responseOutputStream.close(); 

      // JSF doc: 
      // Signal the JavaServer Faces implementation that the HTTP response for this request has already been generated 
      // (such as an HTTP redirect), and that the request processing lifecycle should be terminated 
      // as soon as the current phase is completed. 
      facesContext.responseComplete(); 

     } 

請給我任何解決方案。我利用iText

回答

2

當我看着你的代碼,我看到:

PdfWriter.getInstance(document,response.getOutputStream()); 

這意味着你被指示的iText到PDF字節直接寫入到瀏覽器。此輸出流在關閉文檔時關閉。

我也看到:

OutputStream responseOutputStream = response.getOutputStream(); 

我甚至看到你嘗試添加的東西此流。這是不可能的,因爲流已經關閉。

你需要創建一個ByteArrayOutputStream這樣的:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

而且在PdfWriter使用:

PdfWriter.getInstance(document, baos); 

現在你可以在PDF字節是這樣的:

byte[] pdf = baos.toByteArray(); 

現在您可以編碼這些字節並將它們發送到輸出流。

編碼:

假設你正在使用org.apache.commons.codec.binary.Base64作爲答案解釋Base64 Encoding in Java,你可以這樣做:

byte[] base64 = Base64.encodeBase64(pdf); 

(還有其他的方法來做到這一點。)

發送輸出流:

response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", 
      "must-revalidate, post-check=0, pre-check=0"); 
response.setHeader("Pragma", "public"); 
response.setContentType("application/pdf"); 
response.setContentLength(base64.length); 
OutputStream os = response.getOutputStream(); 
os.write(base64); 
os.flush(); 
os.close(); 
+0

感謝Bruno Lowagie – 2014-12-18 05:07:19

+0

我打算寫一個更長的答案,但我沒有時間詳細說明,所以我很高興看到我的答案足以解決問題。 – 2014-12-18 07:16:15

+0

布魯諾Lowagie請更新它,因爲我需要使用pdf與webservice – 2014-12-18 07:32:40

相關問題