【问题标题】:How to set the cell width in itextsharp pdf creation in MVC4 Razor如何在 MVC4 Razor 中的 itextsharp pdf 创建中设置单元格宽度
【发布时间】:2014-08-08 17:54:48
【问题描述】:

这里我尝试使用 itextsharp pdf 创建设置表格单元格宽度,但由于我使用 html 表格作为字符串,我面临着麻烦

我的代码:

  public ActionResult FormSixteen(EmployeeFormSixteenModel objEmployeeFormSixteenModel)
    {
        string htmlTable = string.Empty;
        htmlTable = htmlTable + "<table><tr><td>S.no</td><td>Head Name</td>Amount<td></td></tr><tr><td>1</td><td>Gross Salary</td>xxxx<td></td></tr></table>";
        Document document = new Document();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=" + objEmployeeFormSixteenModel.EmployeeName + ".pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        document.Open();

        iTextSharp.text.html.simpleparser.StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet();
        iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
        htmlTable = htmlTable.ToString().Replace("'", "\"");
        htmlTable = htmlTable.Replace("px", "");
        StringReader sr = new StringReader(htmlTable.ToString());
        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
        HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
        PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
        pdfDoc.Open();``
        htmlparser.Parse(sr);
        pdfDoc.Close();
        return View("FormSixteen", objEmployeeFormSixteenModel);
    }

我该怎么办?..设置宽度即S.no来减小宽度大小,请帮助我。

【问题讨论】:

    标签: asp.net-mvc-4 razor pdf-generation itextsharp


    【解决方案1】:

    您的问题的基本答案是您只需要为您的 HTML 提供一些实际宽度。

    htmlTable = @"<table>
                   <tr>
                    <td width=""25%"">S.no</td>
                    <td width=""50%"">Head Name</td>
                    <td width=""25%"">Amount</td>
                   </tr>
                   <tr>
                    <td>1</td>
                    <td>Gross Salary</td>
                    <td>xxxx</td>
                   </tr>
                  </table>";
    

    但是您的代码还有很多其他问题。首先,您使用的是HTMLWorker,尽管它仍然存在,但很久以前它已被弃用,取而代之的是XMLWorker。这通常是因为依赖于 4.1.6,如果您正在使用我强烈建议您升级到 5.x。 HTMLWorker 处理几乎为零的 CSS,尽管一个类看起来可以做到这一点,但是如果你有非常基本的 HTML,它仍然可以很好地工作。我下面的代码假定您拥有最新的 iTextSharp,但我仍在使用 HTMLWorker,因为您的 HTML 非常基础。

    其次,您正在创建多个对象实例,例如 DocumentHTMLWorker,但并未使用所有这些实例。

    第三,您的 HTML 在某些地方包含 &lt;/td&gt;&lt;td&gt; 之间的内容,但这可能只是一个转录错误。

    第四,我强烈建议永远不要直接写信给Response.OutputStream。如果抛出任何异常,这可能会导致调试问题,特别是因为 iTextSharp 100% 不知道 ASP.Net,因此它无法处理任何特殊情况。我还建议不要更改 HTTP 标头,直到您确信您拥有代表 PDF 的内容,原因与上述相同。 (当您的异常开始以 PDF 文件名下载但实际上是 HTML 文件时,这真的很有趣!)相反,我建议写信给MemoryStream,获取字节,然后用我的代码对它们做一些事情会的。

    最后,这完全不是问题,但 iTextSharp 5.x 中的许多主要对象都支持IDisposable,因此我们鼓励您在它们上使用using 模式。

    下面显示了上面的关闭。我无法帮助您处理实际的 return View... 部分,但我可以为您提供一个字节数组,您应该可以使用它。在 Web 表单世界中,我们通常会执行 Response.BinaryWrite(bytes);(您的所有 HTTP 标头也都工作)。

    //HTML Work
    string htmlTable = @"<table>
                          <tr>
                           <td width=""25%"">S.no</td>
                           <td width=""50%"">Head Name</td>
                           <td width=""25%"">Amount</td>
                          </tr>
                          <tr>
                           <td>1</td>
                           <td>Gross Salary</td>
                           <td>xxxx</td>
                          </tr>
                         </table>";
    
    //Our final PDF will be stores in this later
    byte[] bytes;
    
    //Create our PDF
    using (var ms = new MemoryStream()) {
        using (var document = new Document()) {
            using (var writer = PdfWriter.GetInstance(document, ms)) {
                document.Open();
    
                //Bind a stream to our string
                using (var sr = new StringReader(htmlTable)) {
                    //Bind a parser to our document
                    using (var htmlparser = new HTMLWorker(document)) {
                        //Parse the HTML into iTextSharp objects and place them directly into the documenht
                        htmlparser.Parse(sr);
                    }
                }
    
                document.Close();
            }
        }
    
        //Grab our finished PDF as a byte array
        bytes = ms.ToArray();
    }
    
    //At this point, the variable bytes holds an array of bytes that represents a valid PDF
    

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2014-02-10
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多