2009-07-02 100 views
25

我想通过它的Save方法将一个PdfSharp.Pdf.PdfDocument保存到一个Stream,但它不会将PDF头设置附加到它。因此,当我读回流并将其返回给用户时,他发现PDF文件无效。在PDFsharp保存到内存时是否有解决方案来附加PDF标头设置?PDFsharp保存到MemoryStream

回答

20

因此,解决办法:

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,但我难以发现任何适当的doc/FAQ里吧。经过几个小时的谷歌搜索,我找到了一个这样的代码片段。现在它可以工作。

+5

什么是PDOC保存呢?与doc相同吗? – 2014-10-29 20:36:37

+0

它为我这样工作: pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(stream); – vicentedealencar 2014-12-19 18:05:24

30

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

编辑: 为了得到一个byte []包含PDF文件时,您只需要拨打:

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

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

所以你必须调用

ms.Seek(0, SeekOrigin.Begin); 

从流中读取之前重置流位置;这对于当前版本不再需要。

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

编辑2:代替stream.ToArray()它可能是更有效地使用stream.GetBuffer(),但这个缓冲区通常比PDF文件较大,你只需要使用stream.Length字节从缓冲区。对于采用byte[]以及长度参数的方法非常有用。

5

对于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 

}