2016-03-23 41 views
1

我有一個基本的方法爲什麼我會得到「此文檔沒有頁面」的任何想法?

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; 
    } 

的是,據我所知,生成有效的HTML,被稱爲在下面的方法

[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; 
     } 

    } 

,但我得到的死亡黃屏用棧跟蹤

[IOException的:該文檔沒有頁]
iTextSharp.text.pdf.PdfPages.WritePageTree()1040
iTextSharp.text.pdf.PdfWriter.Close()285
iTextSharp.text.pdf.PdfDocument.Close()319
iTextSharp.text.pdf.PdfWriter.Close()76
iTextSharp.text .DocWriter.Dispose()+10

我已經收窄,它必須有一些做的HTML,因爲如果我將其更改爲

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

它的工作原理。

我也試過

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>"; 
    } 

和努力。所以我無法弄清楚它不喜歡我真正的方法。有任何想法嗎?

回答

1

你內心foreach塊有一個最後的不正確<td>標籤,應該是一個</td>代替:

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↑ 

當我做出改變一切編譯我。

相關問題