Как установить ширину ячейки при создании itextsharp pdf в MVC4 Razor

#asp.net-mvc-4 #razor #pdf-generation #itextsharp

#asp.net-mvc-4 #razor #pdf-генерация #itext

Вопрос:

Здесь я пытаюсь установить ширину ячейки таблицы, используя создание 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:

Основной ответ на ваш вопрос заключается в том, что вам просто нужно указать некоторую фактическую ширину вашего 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 очень простой.

Во-вторых, вы создаете несколько экземпляров объектов, таких как Document и HTMLWorker , но не используете их все.

В-третьих, в вашем HTML есть содержимое </td><td> в некоторых местах, однако, возможно, это была просто ошибка транскрипции.

В-четвертых, я настоятельно рекомендую НИКОГДА не писать напрямую в Response.OutputStream . Это может вызвать проблемы с отладкой, если возникают какие-либо исключения, тем более, что iTextSharp на 100% не знает о ASP.Net, поэтому он не может обрабатывать какие-либо особые случаи. Я также рекомендую не изменять заголовки HTTP, пока вы не будете уверены, что у вас есть что-то, что представляет PDF-файл по тем же причинам, что и выше. (Это действительно весело, когда ваши исключения начинают загружаться с именем файла PDF, но на самом деле являются файлами HTML!) Вместо этого я рекомендую записывать в a MemoryStream , захватывать байты, а затем делать с ними что-то, что делает мой код.

Наконец, и это не проблема, но многие из основных объектов в iTextSharp 5.x поддерживают IDisposable , поэтому вам рекомендуется использовать using шаблон для них.

Ниже показано, что вышеуказанное отключено. Я не могу помочь вам с фактической return View... частью, но я могу предоставить вам массив байтов, с которым вы сможете что-то сделать. В мире веб-форм мы обычно выполняем a 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