【问题标题】:Any ideas on why I get "This document has no pages"?关于为什么我得到“此文档没有页面”的任何想法?
【发布时间】:2016-07-11 09:58:43
【问题描述】:

我有一个基本的方法

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

而且效果很好。所以我无法弄清楚它不喜欢我的真实方法。有什么想法吗?

【问题讨论】:

    标签: c# html .net pdf itextsharp


    【解决方案1】:

    您的内部foreach 块末尾有一个不正确的&lt;td&gt; 标签,应该是&lt;/td&gt;

    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↑
    

    当我做出改变时,一切都会为我编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2017-09-08
      • 2021-08-06
      • 2022-01-11
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多