2011-06-16 23 views
6

Aşağıdaki kod parçacığı bozuk PDF belgesini döndürüyor, ancak birleştirilen Belge'yi döndürürsem, her zaman geçerli bir PDF döndürür. mergedDocument, Word kullanarak oluşturduğum bir PDF dosyasına dayanır, tamamlanmış belge ise tamamen programlı olarak oluşturulur. Kod, hiçbir istisna atamadığı için "çalışır". ITextSharp neden bozuk PDF oluşturuyor?iTextSharp bozuk PDF üretiyor

byte[] completedDocument = null;    
using (MemoryStream streamCompleted = new MemoryStream()) 
{ 
    using (Document document = new Document()) 
    {      
     PdfCopy copy = new PdfCopy(document, streamCompleted); 
     document.Open(); 
     copy.Open();      

     foreach (var item in eventItems) 
     { 
      byte[] mergedDocument = null; 
      PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]); 
      using (MemoryStream streamTemplate = new MemoryStream()) 
      { 
       using (PdfStamper stamper = new PdfStamper(reader, streamTemplate)) 
       { 
        foreach (var token in item.DataTokens) 
        { 
         if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString())) 
         { 
          stamper.AcroFields.SetField(token.Key.ToString(), token.Value); 
         } 
        } 
        stamper.FormFlattening = true; 
        stamper.Writer.CloseStream = false; 
       } 

       mergedDocument = new byte[streamTemplate.Length]; 
       streamTemplate.Position = 0; 
       streamTemplate.Read(mergedDocument, 0, (int)streamTemplate.Length); 
      } 
      reader = new PdfReader(mergedDocument); 

      for (int i = 1; i <= reader.NumberOfPages; i++) 
      { 
       document.SetPageSize(PageSize.A4); 
       copy.AddPage(copy.GetImportedPage(reader, i)); 
      } 
     } 
     completedDocument = new byte[streamCompleted.Length]; 
     streamCompleted.Position = 0; 
     streamCompleted.Read(completedDocument, 0, (int)streamCompleted.Length); 
    }     
} 
return completedDocument; 

cevap

20

PDF yazma tampon temizlemek document ve copy nesneleri kapatmak gerekir. Bununla birlikte, bu, akışı bir diziye okumaya çalışırken bazı sorunlara neden olur. Düzeltme, kapalı akışlarda hala çalışan MemoryStream'un ToArray() yöntemini kullanmaktır. Yaptığım değişikliklerin yorumları var.

 byte[] completedDocument = null; 
     using (MemoryStream streamCompleted = new MemoryStream()) 
     { 
      using (Document document = new Document()) 
      { 
       PdfCopy copy = new PdfCopy(document, streamCompleted); 
       document.Open(); 
       copy.Open(); 

       foreach (var item in eventItems) 
       { 
        byte[] mergedDocument = null; 
        PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]); 
        using (MemoryStream streamTemplate = new MemoryStream()) 
        { 
         using (PdfStamper stamper = new PdfStamper(reader, streamTemplate)) 
         { 
          foreach (var token in item.DataTokens) 
          { 
           if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString())) 
           { 
            stamper.AcroFields.SetField(token.Key.ToString(), token.Value); 
           } 
          } 
          stamper.FormFlattening = true; 
          stamper.Writer.CloseStream = false; 
         } 
         //Copy the stream's bytes 
         mergedDocument = streamTemplate.ToArray(); 
        } 
        reader = new PdfReader(mergedDocument); 

        for (int i = 1; i <= reader.NumberOfPages; i++) 
        { 
         document.SetPageSize(PageSize.A4); 
         copy.AddPage(copy.GetImportedPage(reader, i)); 
        } 
        //Close the document and the copy 
        document.Close(); 
        copy.Close(); 
       } 
       //ToArray() can operate on closed streams 
       completedDocument = streamCompleted.ToArray(); 
      } 
     } 
     return completedDocument; 
+2

, html dönüştürmek ise emin html hr etiketi içeren gelmez olun. –

+0

Yapabilirsem 1000 kere kazanırdım. Görüntüleri ve pdfs'leri tek bir pdf belgesine birleştirmekte zorluk çekiyordum, bu da doğru sürece ışık tuttu. – jtiger

+0

Teşekkür ederim, boş bir PDF dosyasına geri dönerek sorunumu çözdüm. – Taurib

0

Ayrıca hile yaptı Çok teşekkür ederim pdf

hdnEditorText.Value.Replace("\"", "'").Replace("<hr />", "").Replace("<hr/>", "") 
+0

Neden? Bir hr etiketine sahip olmanın nesi yanlış? – Kevin

İlgili konular