2012-01-11 34 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