Itext.Sharp Document to byte array problme

时间:2014-06-17 15:05:23

标签: asp.net-mvc itextsharp

我有以下代码:

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时,它表示已损坏。 不知何故,字节数组是空的。 可以说我,我做错了什么?

2 个答案:

答案 0 :(得分:1)

这是错误的:

iTextSharp.text.Document document = new iTextSharp.text.Document();
document.Open();

使用5个简单步骤创建PDF:

  1. 创建Document对象
  2. 创建PdfWriter实例
  3. 打开文档
  4. 添加内容
  5. 关闭文档
  6. 您没有第2步。在您的评论中,您说通过在打开文档后创建该实例来解决问题,但这是错误的!您需要在打开文档之前创建PdfWriter实例

    打开文档会将PDF标题写入OutputStream。如果没有有效的PdfWriter实例,情况就不会发生。

答案 1 :(得分:0)

我试图和你做同样的事情。 经过多次尝试,我发现如果我放PdfWriter.GetInstanceusing (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。:这是我控制器内的一个方法。