【问题标题】:Generate PDF in Memory在内存中生成 PDF
【发布时间】:2014-04-24 02:49:22
【问题描述】:

我正在使用 ITextSharp 生成 pdf,我必须使用 MemoryStream 在内存中生成 pdf(因为我不必物理保存文件)。我已经生成了流,但我不明白如何在内存中生成 pdf。 这就是我生成流的方式

  private static byte[] GetFileStream()
    {
        var stream = new MemoryStream();
        Document document = new Document(PageSize.A4, 1f, 1f, 1f, 1f);
        PdfWriter writer = PdfWriter.GetInstance(document, stream);
        document.Open();
        try
        {
            StringBuilder sb= new StringBuilder();
            sb.Append("<table class=\"table\">");
            sb.Append("<thead>");
            sb.Append("<tr>");
            sb.Append(" <th> Crime Category </th>");
            sb.Append(" <th>Date</th>");
            sb.Append(" <th>City</th>");
            sb.Append(" <th>Description</th>");
            sb.Append(" <th>Option(s)</th>");
            sb.Append(" </tr>");
            sb.Append(" </thead>");
            sb.Append(" <tbody>");
  sb.Append(" <tr><td>This is a test</td><td>2</td><td>3</td><td>4</td><td>5</td><tr/>");
            sb.Append(" </tbody>");
            sb.Append(" </table>");
            List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(misdem.ToString()), null);
            for (int k = 0; k < htmlarraylist.Count; k++)
            {
                document.Add((IElement)htmlarraylist[k]);
            }
        }
        catch (Exception ex)
        { }
        finally
        {
            document.Close();
        }

        return stream.GetBuffer();
    }

byte[] pdfByteData = GetFileStream();
var ms = new MemoryStream(pdfByteData);

我尝试使用它,但它抛出异常

令牌''不是预期的。

using (PdfSharp.Pdf.PdfDocument inputDocument = PdfSharp.Pdf.IO.PdfReader.Open(ms, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import))
            {
                int count = inputDocument.PageCount;
                for (int idx = 0; idx < count; idx++)
                {
                    PdfSharp.Pdf.PdfPage page1 = inputDocument.PageCount > idx ? inputDocument.Pages[idx] : new PdfSharp.Pdf.PdfPage();
                    //       outputDocument.AddPage(page1);
                }
            }

【问题讨论】:

    标签: c# itextsharp


    【解决方案1】:

    4 年后...

    我知道你犯了一个错误

    sb.Append(" <tr><td>This is a test</td><td>2</td><td>3</td><td>4</td><td>5</td><tr/>");
    

    &lt;tr/&gt; 应该是&lt;/tr&gt;

    【讨论】:

      【解决方案2】:

      尝试做:

      ms.Seek(0, SeekOrigin.Begin);
      

      刚刚创建MemoryStream

      编辑: 还要更改返回数据的方式,我不确定GetBuffer 是否符合您的期望。试试这个(你目前有return stream.GetBuffer();

      stream.Flush();
      stream.Seek(0, SeekOrigin.Begin);
      byte[] data = new byte[stream.Length];
      stream.Read(data, 0, (int)stream.Length);
      return data;
      

      【讨论】:

      • 似乎有帮助,但我现在得到非否定不允许:(
      • 这里使用 (PdfSharp.Pdf.PdfDocument inputDocument = PdfSharp.Pdf.IO.PdfReader.Open(ms, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import))
      • 刚刚意识到您在创建 sb 后不使用它,而是使用名为 misdem 的东西 - 错误?
      猜你喜欢
      • 2011-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多