PDFsharp保存到MemoryStream

49
我想通过PdfSharp.Pdf.PdfDocument的Save方法将其保存到Stream中,但它没有将PDF头设置附加到其中。 因此,当我读取回Stream并将其返回给用户时,他会发现PDF文件无效。 当PDFsharp保存到内存时,是否有一种解决方案可以附加PDF头设置?
5个回答

62
如果您认为PdfDocument.Save存在问题,请在PDFsharp论坛上报告此问题(但请更具体地描述您的错误描述)。 您的“解决方案”在我看来像是一个hack。 “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[] 和长度参数的方法非常有用。


26

所以解决方案:

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);
}

有一个叫做MigraDoc的东西,它是与PdfSharp一起使用的,但是我几乎找不到任何合适的文档/常见问题解答。经过几个小时的谷歌搜索,我找到了一个类似于这样的代码片段。现在它可以工作了。


7
pDoc是什么?它和doc一样吗? - Léon Pelletier
2
它对我来说是这样工作的: pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(stream); - vicentedealencar

22

3
我的答案自2010年以来就表明可以使用ToArray()。;-) - I liked the old Stack Overflow

7
对于MigraDoc(版本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

}

-2

谢谢Misnyo Solution。但对我来说,它是这样工作的:

        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;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接