#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