Asp.net mvc Itext.Sharp文档到字节数组问题

Asp.net mvc Itext.Sharp文档到字节数组问题,asp.net-mvc,itextsharp,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); PdfPT

我有以下代码:

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文件时,它说文件已损坏。 不知何故,字节数组是空的。 你能告诉我我做错了什么吗?

这是错的:

iTextSharp.text.Document document = new iTextSharp.text.Document();
document.Open();
使用5个简单步骤创建PDF:

  • 创建
    文档
    对象
  • 创建一个
    PdfWriter
    实例
  • 打开文档
  • 添加内容
  • 关闭文档
  • 你没有第二步。在您的评论中,您说您已经通过在打开文档后创建该实例解决了问题,但这是错误的!在打开文档之前,需要创建
    PdfWriter
    实例


    打开文档会将PDF标题写入
    OutputStream
    。如果没有有效的
    PdfWriter
    实例,这是不可能发生的。

    我正试图做与您相同的事情。 经过多次尝试,我发现如果我将
    PdfWriter.GetInstance
    内部使用(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;
        }
    
    public FileContentResult GetPDF(){
    字符串htmlContent=“第一行

    第二行

    ”; StringReader sr=新的StringReader(htmlContent); 文档pdfDoc=新文档(PageSize.A4、10f、10f、100f、0f); HTMLWorker hw=新HTMLWorker(pdfDoc); 文件内容结果; 使用(var ms=new MemoryStream()){ GetInstance(pdfDoc,ms); pdfDoc.Open(); 硬件解析(sr); pdfDoc.Close(); 结果=这个.File(ms.ToArray(),“application/pdf”,“teste.pdf”); } 返回结果; }

    注:这是我控制器中的一个方法。

    实际上,PdfWriter应该在文档打开之前就实例化。您的“解决方案”是错误的,请删除注释。有关正确的解决方案,请参见我的答案。谢谢你们的告别,伙计们。