2012-01-11 36 views
0

我有一個Java代碼來創建一個PDF臨時文件並保存到BLOB字段DB。 PDF正確生成,並且BLOB被保存到DB中。當我重新創建PDF時,這將返回沒有空白字符!可能問題是bytearrayoutputstream的編碼Base64。這是我的代碼PDF到bytearrayoutpustream空白

public ByteArrayOutputStream generaFatturaStampaPDF(Fattura fattura) { 
    try { 
     Document document = new Document(PageSize.A4, 72, 72, 120, 90); 

     String tempdir = System.getProperty("java.io.tmpdir"); 

     if (!(tempdir.endsWith("/") || tempdir.endsWith("\\"))) 
      tempdir = tempdir + System.getProperty("file.separator"); 

     File tempFattura = File.createTempFile("fattura",".pdf", new File(tempdir)); 
     tempFattura.deleteOnExit(); 

     setFileTempFattura(tempFattura.toString()); 

     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(tempFattura)); 
     writer.setPdfVersion(PdfWriter.VERSION_1_7); 
     writer.setPageEvent(new HeaderFooter()); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PdfWriter docWriter = null; 
     docWriter = PdfWriter.getInstance(document, baos); 
     docWriter.setPdfVersion(PdfWriter.VERSION_1_7); 
     docWriter.setPageEvent(new HeaderFooter()); 


     document.open(); 
     addMetaDataFattura(document); 

     Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD, BaseColor.BLACK); 
     Paragraph paragrafoFattura = new Paragraph(); 
     paragrafoFattura.setAlignment(Element.ALIGN_CENTER); 
     Chunk c = new Chunk("Fattura"); 
     c.setFont(catFont); 
     paragrafoFattura.add(c); 
     document.add(paragrafoFattura); 

     intestazioneFatturaStampa(writer, fattura); 
     intestazioneFatturaStampa(docWriter, fattura); 
     addEmptyLine(document, 7); 

     float[] widths = { 8f, 2f }; 
     PdfPTable table = new PdfPTable(widths); 
     table.setHorizontalAlignment(Element.ALIGN_CENTER); 
     table.setWidthPercentage(100); 
     table.setHeaderRows(1); 

     addCenterTableHeaderBold(table, "Descrizione", true, 12); 
     addCenterTableHeaderBold(table, "Totale", true, 12); 

     Double somma = 0.0; 
     Iterator<FatturaDettaglio> iterator = fattura.getFatturaDettaglios().iterator(); 
     while (iterator.hasNext()) { 
      FatturaDettaglio fatturaDettaglio = iterator.next(); 
      somma += fatturaDettaglio.getPrezzo(); 
     } 
     addCenterTableHeaderBoldAllignLeft(table, fattura.getFatturaDettaglios().size() 
       + " Richieste di Preventivo ", false, 12); 
     addCenterTableHeaderBold(table, "€ " + arrotonda(somma), false, 12); 

     Iterator<CreditoDebito> iterator2 = fattura.getCreditoDebitos().iterator(); 
     while (iterator2.hasNext()) { 
      CreditoDebito creditoDebito = iterator2.next(); 

      addCenterTableHeaderBoldAllignLeft(table, creditoDebito.getNote(), false, 12); 
      String segno = ""; 
      if (creditoDebito.getTipo().equals("C")) { 
       segno = "-"; 
       somma = somma - creditoDebito.getImporto(); 
      } 
      if (creditoDebito.getTipo().equals("D")) { 
       segno = ""; 
       somma = somma + creditoDebito.getImporto(); 
      } 
      addCenterTableHeaderBold(table, "€ " + segno 
        + arrotonda(creditoDebito.getImporto()), false, 12); 
     } 

     document.add(table); 

     addEmptyLine(document, 2); 

     float[] widths1 = { 2f, 1f }; 
     PdfPTable table1 = new PdfPTable(widths1); 
     table1.setHorizontalAlignment(Element.ALIGN_RIGHT); 
     table1.setWidthPercentage(60); 

     addCenterTableHeader(table1, "Totale Imponibile netto", true); 
     addCenterTableHeader(table1, "€ " + arrotonda(somma), false); 

     addCenterTableHeader(table1, "IVA", true); 
     addCenterTableHeader(table1, "€ " + arrotonda(somma * 20/100), false); 

     addCenterTableHeader(table1, "Totale Fattura", true); 
     addCenterTableHeader(table1, "€ " + arrotonda(somma + somma * 20/100), false); 

     document.add(table1); 

     addEmptyLine(document, 2); 

     paragrafoFattura.setAlignment(Element.ALIGN_LEFT); 
     Chunk datiPagamento = 
       new Chunk("Dettagli pagamento:\nMetodo: " 
         + fattura.getAzienda().getMetodoPagamento() 
         + "\nIBAN: IT xx X xxxxx xxxxx xxxxxxxxxxx"); 
     document.add(datiPagamento); 
     addEmptyLine(document, 5); 
     Chunk dettagliEstrattoContoTesto = 
       new Chunk(
         "Per maggiori dettagli sulle richieste di preventivo e eventuali promozioni consultare l'estratto conto allegato"); 
     dettagliEstrattoContoTesto.setFont(new Font(Font.FontFamily.TIMES_ROMAN, 10, 
       Font.NORMAL, BaseColor.BLACK)); 
     document.add(dettagliEstrattoContoTesto); 
     document.close(); 
     docWriter.close(); 

     return baos; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

你怎麼不空格字符的意思?什麼地方和什麼地方缺少空白? – Alasdair 2012-01-11 11:08:55

+0

當我重新創建PDF這個字符串「Permagiori dettagli sulle richieste di preventivo e eventual promozioni consultare l'estratto conto allegato」被寫爲「Permaggioridettaglisullerichiestedipreventivoeeventualipromozioniconsultarel'estrattocontoallegato」 – 2012-01-11 11:21:57

+1

PDF文件不能被修改而不完全腐敗,所以如果有東西在文件中更改,那麼你甚至不可能打開它。你確定這個錯誤不會發生在你原來的?另外,爲什麼你需要base64編碼?你不能將它存儲爲二進制文件嗎? – Alasdair 2012-01-11 11:25:52

回答

0

儘量壓縮第一含有PDF的字符串,然後將其放入壓縮數據庫,然後拉出來時,解壓縮。這將確保沒有任何更改,並將字符串處理爲二進制。

+0

我創建的創建具有iText的一個臨時PDF文件的同時創建,其中我複製PDF文件的內容,然後保存ByteArrayOutputStream與另一方法.pdf文件一個ByteArrayOutputStream的方法通過電子郵件發送並且是正確的。然後,我創建了另一種方法,可以從DB返回PDF輸出。該文件返回給我,但是,與消除抖動之間的空間:要清楚,如果我有這個句子中的原始PDF:「更多信息」從DB我的PDF文件再生:「Formoreinformation」。可能是什麼問題呢? – 2012-01-11 13:44:33

+0

你試過我說的嗎?如果仍然存在問題,那麼問題在於通過電子郵件進行傳輸,而不是從數據庫傳輸,而這正是您最初暗示的。 – Alasdair 2012-01-11 15:13:24