PDFsharp 保存到 MemoryStream

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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;
        

【讨论】:

以上是关于PDFsharp 保存到 MemoryStream的主要内容,如果未能解决你的问题,请参考以下文章

MemoryStream 到 HttpResponseMessage

将 MemoryStream 文件存储到 Azure Blob

将 iTextSharp 文档加载到 MemoryStream

将文件从 MemoryStream 附加到 C# 中的 MailMessage

csharp PdfSharp / MigraDoc到AzureStorage

HTML到PDF - 使用PdfSharp和HtmlRenderer分页