2016-03-23 8 views
1

Ich habe eine grundlegende MethodeIrgendwelche Ideen, warum ich bekomme "Dieses Dokument hat keine Seiten"?

public string PdfFriendlyHtml (Guid pid, int vid, int sid) 
    { 
     string html = string.Empty; 
     html += "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>"; 
     html += "<p>blah blah blah</p>"; 
     html += "<p>blah blah blah</p>"; 
     html += "</td></tr>"; // end header row 
     List<SurveyFullInfo> Surveys = new List<SurveyFullInfo>(); 
     for (int k = 1; k <= sid; ++k) 
     { 
      Surveys.Add(new SurveyFullInfo 
      { 
       Title = this._Db.GetSurveyTitle(k), 
       ViewModel = this._Db.GetAnswersByPartner(pid, k, vid), 
       SectionAverages = this._Db.GetSectionAverages(pid, k, vid) 
      }); 
     } 
     foreach (var Survey in Surveys) 
     { 
      html += "<tr><td bgcolor=\"#EDEDED\">"; // open survey title and traffic lights 
      html += "<h1>" + Survey.Title + "</h1>"; // write title 
      html += "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">"; 
      foreach (var S in Survey.SectionAverages) 
      { 
       RangeInfo Info = AnswersController.Ranges.First(I => I.Range.X <= S.AvgScore && S.AvgScore < I.Range.Y); 
       html += "<tr><td><div valign=\"middle\" style=\"background-color:" + Info.ColorHex + ";height:20px;width:20px;\"></div></td>" 
         + "<td><h3>" + String.Format("{0}: {1}%", S.SectionTitle, S.AvgScore.ToString()) + "</h3>" 
         + "<p>" + Info.Text + "</p><td></tr>"; 


      } 
      html += "</table></td></tr>"; // end survey title and traffic lights row 
     } 


     html += "</table>"; // end table 
     return html; 
    } 

, die, soweit ich, valides HTML erzeugt sagen kann und wird in dem folgenden Verfahren

[HttpPost] 
    [OutputCache(NoStore = true, Duration = 0)] 
    public ActionResult ToPdf (Guid pid, int vid, int sid) 
    { 


     Byte[] bytes; 
     var ms = new MemoryStream(); 
     try 
     { 
      using (var doc = new Document()) 
      { 
       using (var writer = PdfWriter.GetInstance(doc, ms)) 
       { 
        writer.CloseStream = false; 
        doc.Open(); 
        var example_html = PdfFriendlyHtml(pid, vid, sid); 
        var example_css = @".headline{font-size:200%}"; 
        using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css))) 
        { 
         using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html))) 
         { 
          iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss); 
         } 
        } 
        doc.Close(); 
       } 
      } 
      bytes = ms.ToArray(); 
      ms.Position = 0; 
      return File(ms, "application/pdf", "Test.pdf"); 
     } 
     catch 
     { 
      ms.Dispose(); 
      throw; 
     } 

    } 

aber ich habe den gelben Schirm des Todes mit einem genannt Spuren stapeln

[IOException. Das Dokument hat keine Seiten]
iTextSharp.text.pdf.PdfPages.WritePageTree() 1.040
iTextSharp.text.pdf.PdfWriter.Close() +285
iTextSharp.text.pdf.PdfDocument.Close() +319
iTextSharp.text.pdf.PdfWriter.Close() +76
iTextSharp.text (.DocWriter.Dispose) +10

ich habe es verengt, dass es etwas mit dem HTML zu tun haben muss, da, wenn ich es zu

ändern
public string PdfFriendlyHtml (Guid pid, int vid, int sid) 
    { 
     return "<p>Test</p>"; 
    } 

es funktioniert.

Ich habe auch versucht

public string PdfFriendlyHtml (Guid pid, int vid, int sid) 
    { 
     return "<table><tr><td>Here's a cell</td><td>And here's another cell</td></tr></table>"; 
    } 

und gearbeitet. So kann ich nicht herausfinden, was es an meiner wahren Methode nicht mag. Irgendwelche Ideen?

Antwort

1

Ihr innerer foreach Block hat einen falschen <td>-Tag am Ende, dass ein </td> stattdessen sein sollte:

RangeInfo Info = AnswersController.Ranges.First(I => I.Range.X <= S.AvgScore && S.AvgScore < I.Range.Y); 
html += "<tr><td><div valign=\"middle\" style=\"background-color:" + Info.ColorHex + ";height:20px;width:20px;\"></div></td>" 
     + "<td><h3>" + String.Format("{0}: {1}%", S.SectionTitle, S.AvgScore.ToString()) + "</h3>" 
     + "<p>" + Info.Text + "</p></td></tr>"; 
//        ↑HERE↑ 

Wenn ich mache, dass der Wandel alles für mich zusammenzustellt.

Verwandte Themen