我有以下代码:
public byte[] ExportToPdf(DataTable dt)
{
iTextSharp.text.Document document = new iTextSharp.text.Document();
document.Open();
iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.HELVETICA, 5);
PdfPTable table = new PdfPTable(dt.Columns.Count);
PdfPRow row = null;
float[] widths = new float[] { 4f, 4f, 4f, 4f, 4f, 4f, 4f, 4f };
table.SetWidths(widths);
table.WidthPercentage = 100;
foreach (DataColumn c in dt.Columns)
{
table.AddCell(new Phrase(c.ColumnName, font5));
}
document.Add(table);
document.Close();
byte[] bytes;
MemoryStream msPDFData = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(document, msPDFData);
return msPDFData.ToArray();
}
在另一个函数中,我调用这样的函数:
byte[] bytes = ExportToPdf(table);
return File(bytes, "application/pdf", "RaportDocumenteEmise.pdf");
当我尝试打开pdf时,它表示已损坏。 不知何故,字节数组是空的。 可以说我,我做错了什么?
答案 0 :(得分:1)
这是错误的:
iTextSharp.text.Document document = new iTextSharp.text.Document();
document.Open();
使用5个简单步骤创建PDF:
Document
对象PdfWriter
实例您没有第2步。在您的评论中,您说通过在打开文档后创建该实例来解决问题,但这是错误的!您需要在打开文档之前创建PdfWriter
实例。
打开文档会将PDF标题写入OutputStream
。如果没有有效的PdfWriter
实例,情况就不会发生。
答案 1 :(得分:0)
我试图和你做同样的事情。
经过多次尝试,我发现如果我放PdfWriter.GetInstance
在using (var ms = new MemoryStream()) { }
内,一切正常!
我的完整代码是:
public FileContentResult GetPDF() {
string htmlContent = "<p>First line</p><p>Second line</p>";
StringReader sr = new StringReader(htmlContent);
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
HTMLWorker hw= new HTMLWorker(pdfDoc);
FileContentResult result;
using (var ms = new MemoryStream()) {
PdfWriter.GetInstance(pdfDoc, ms);
pdfDoc.Open();
hw.Parse(sr);
pdfDoc.Close();
result = this.File(ms.ToArray(), "application/pdf", "teste.pdf");
}
return result;
}
Ps。:这是我控制器内的一个方法。