如何在MVC4 Razor中的itextsharp pdf创建中设置单元格宽度

时间:2014-06-18 12:22:07

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

这里我尝试使用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减小宽度尺寸,请帮帮我。

1 个答案:

答案 0 :(得分:0)

您问题的基本答案是您只需要为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,但由于您的HTML非常基本,我仍在使用HTMLWorker

其次,您正在制作多个对象实例,例如DocumentHTMLWorker但不使用所有对象。

第三,您的HTML在某些地方的内容介于</td><td>之间,但这可能仅仅是转录错误。

第四,我强烈建议从不直接写入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