【问题标题】:Saving Panel to PDF not working nor getting errors将面板保存为 PDF 无法正常工作或出现错误
【发布时间】:2014-01-30 14:44:06
【问题描述】:

我正在尝试使用 ITextSharp 将面板保存为 pdf。当我设置断点并调试时,代码在这行代码处停止,但它没有报错,只是停止。

if (IsPostBack)
{
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;filename=Quote.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);

    **Panel1.RenderControl(hw);**

    StringReader sr = new StringReader(sw.ToString());
    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
    pdfDoc.Open();
    htmlparser.Parse(sr);
    pdfDoc.Close();
    Response.Write(pdfDoc);
    Response.End();
}

在面板中,我有文本框、标签和 GridView。

【问题讨论】:

  • 如果您在此特定行上失败,那么您遇到了 ASP.Net 问题,而不是 iTextSharp。您能否发布更多代码,以便我们了解发生了什么。
  • @ChrisHaas - 抱歉回复晚了,我不得不处理责任。请检查我对代码的编辑。
  • 您的编辑删除了“这一行”,您可能需要重新突出显示它。回到我原来的问题,如果你把 iTextSharp 的东西注释掉,它还会坏吗?
  • 代码已编辑。我收到错误“文档没有页面。”。

标签: c# asp.net itextsharp panel


【解决方案1】:

你有几个问题。如果您收到 The document has no pages 消息,这意味着没有向 PDF 添加任何内容,这几乎肯定意味着 RenderControl 方法存在问题,与 iTextSharp 无关。另一个问题是您正在写入Response.OutputStream 以及使用Response.Write(pdfDoc) 输出文字文档。你只需要做前者,我实际上不确定后者会发生什么。

The document has no pages 消息也可能意味着 iTextSharp 找不到任何内容可用于创建内容。因此,您可能拥有有效的 HTML,但 iTextSharp 只是不知道如何处理它。这可能不是这种情况,但我不得不提一下。

我将把你的代码分解成几个步骤来帮助调试。前两个块将控件转换为 HTML,然后对其进行健全性检查以确保我们得到了一些东西。如果您有任何问题,请检查buf 的内容。

第三个块从MemoryStream 创建一个PDF,然后将其转储到一个字节数组中,而不是直接写入Response.OutputStream。尽管写信给Response.OutputStream 并没有什么不妥之处,但您经常会发现自己正在吞下错误,而且通常调试要困难得多。完成此块后,您应该检查 bytes 以确保它有东西。

最后一个块最终推送到浏览器。

//Convert our control to HTML
string buf;
using (var sw = new StringWriter()) {
    using (var hw = new HtmlTextWriter(sw)) {
        Panel1.RenderControl(hw);
    }
    buf = sw.ToString();
}

//Sanity check
if (String.IsNullOrWhiteSpace(buf)) {
    throw new ApplicationException("No content found");
}

//Create our PDF and get a byte array
byte[] bytes;
using (var ms = new MemoryStream()) {
    using (var pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f)) {
        using (var writer = PdfWriter.GetInstance(pdfDoc, ms)) {
            pdfDoc.Open();
            using (var htmlparser = new HTMLWorker(pdfDoc)) {
                using (var sr = new StringReader(buf)) {
                    htmlparser.Parse(sr);
                }
            }
            pdfDoc.Close();
        }
    }
    bytes = ms.ToArray();
}


//Output the PDF
Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=Quote.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(bytes);
Response.End();

【讨论】:

  • 谢谢克里斯,但是这仍然不起作用......我一直在这上面花费了几个小时,发现我需要将我的项目转换为 MVC。听起来 HTML 是这里的问题,当我创建一个包含一些小数据的新 aspx 页面时,代码工作正常。再次感谢您。
  • 或者也许我不必转换为 MVC,但这意味着我必须将所有项目放在面板内的表格中并对每个单元格进行编码以复制到 PDF。
  • 在探索了运行相同代码的不同方法之后。我拿起文本框给出错误“需要嵌套在带有 runat 服务器的表单中,它是什么?这是什么意思?
  • 查看此内容以处理“XYZ 必须放在带有 runat="server" 的表单标签内”。 stackoverflow.com/a/6343859/231316
猜你喜欢
  • 2021-02-08
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多