这里我尝试使用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减小宽度尺寸,请帮帮我。
答案 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
。
其次,您正在制作多个对象实例,例如Document
和HTMLWorker
但不使用所有对象。
第三,您的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