【问题标题】:PDFsharp save to MemoryStreamPDFsharp 保存到 MemoryStream
【发布时间】:2010-11-07 13:55:21
【问题描述】:

我想通过其 Save 方法将 PdfSharp.Pdf.PdfDocument 保存到 Stream,但它没有将 PDF 标题设置附加到它。因此,当我读回 Stream 并将其返回给用户时,他看到 PDF 文件无效。 PDFsharp保存到内存时是否有附加PDF标题设置的解决方案?

【问题讨论】:

    标签: c# .net pdf stream pdfsharp


    【解决方案1】:

    所以解决办法:

    MigraDoc.DocumentObjectModel.Document doc = new MigraDoc.DocumentObjectModel.Document();
    MigraDoc.Rendering.DocumentRenderer renderer = new DocumentRenderer(doc);
    MigraDoc.Rendering.PdfDocumentRenderer pdfRenderer = new MigraDoc.Rendering.PdfDocumentRenderer();
    pdfRenderer.PdfDocument = pDoc;
    pdfRenderer.DocumentRenderer = renderer;
    using (MemoryStream ms = new MemoryStream())
    {
      pdfRenderer.Save(ms, false);
      byte[] buffer = new byte[ms.Length];
      ms.Seek(0, SeekOrigin.Begin);
      ms.Flush();
      ms.Read(buffer, 0, (int)ms.Length);
    }
    

    PdfSharp 附带了这个 MigraDoc 的东西,但我几乎没有找到任何合适的文档/常见问题解答。经过数小时的谷歌搜索,我发现了一个类似这样的 sn-p。现在可以了。

    【讨论】:

    • 什么是 pDoc?和doc一样吗?
    • 它对我有用:pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(stream);
    【解决方案2】:

    如果您认为 PdfDocument.Save 存在问题,请在 PDFsharp 论坛上报告此问题(但请更具体地说明您的错误描述)。 你的“解决方案”对我来说就像一个黑客。 “pdfRenderer.Save”在内部调用“PdfDocument.Save”。 无论问题是什么 - 您的“解决方案”仍然调用相同的保存例程。

    编辑: 要获取包含 PDF 文件的 byte[],您只需调用:

    MemoryStream stream = new MemoryStream();
    document.Save(stream, false);
    byte[] bytes = stream.ToArray();
    

    早期版本的 PDFsharp 不会重置流位置。

    所以你必须打电话

    ms.Seek(0, SeekOrigin.Begin); 
    

    在从流中读取之前重置流位置;当前版本不再需要此功能。

    通常可以使用 ToArray 代替从流中读取。

    编辑 2:使用stream.GetBuffer() 代替stream.ToArray() 可能更有效,但此缓冲区通常比PDF 文件大,您只需使用该缓冲区中的stream.Length 字节。对于采用byte[] 和长度参数的方法非常有用。

    【讨论】:

      【解决方案3】:

      我找到了更简单的解决方案:

      byte[] fileContents = null; 
      using(MemoryStream stream = new MemoryStream()) 
      { 
          pdfDoc.Save(stream, true); 
          fileContents = stream.ToArray(); 
      }
      

      来源: http://usefulaspandcsharp.wordpress.com/2010/03/09/save-a-pdf-to-a-byte-array-using-pdf-sharpmigradoc/

      【讨论】:

      • 我的回答显示自 2010 年以来可以使用 ToArray()。 ;-)
      【解决方案4】:

      对于 MigraDoc (ver 1.30),我可以用

      保存它
      PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
      renderer.Document = report.m_Document;
      
      renderer.RenderDocument();
      
      
      using (MemoryStream stream = new MemoryStream())
      {
          renderer.PdfDocument.Save(stream, false);
          ... your code in here
      
      }
      

      【讨论】:

        【解决方案5】:

        感谢 Misnyo 解决方案。但对我来说,它是这样工作的:

                Document document = new Document();
                PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();   
        
                //Add to document here.......
        
                //render the document with pdf renderer
                pdfRenderer.Document = document;
                pdfRenderer.RenderDocument();
        
                //Save renderer result into stream   
                using(MemoryStream ms = new MemoryStream())
                {
                    pdfRenderer.PdfDocument.Save(ms, false);
                    byte[] buffer = new byte[ms.Length];
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.Flush();
                    ms.Read(buffer, 0, (int)ms.Length);
                    ms.Position = 0;
                }
        

        【讨论】:

          猜你喜欢
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 2014-06-09
          • 2013-09-16
          • 1970-01-01
          相关资源
          最近更新 更多