2009-07-02 116 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 

} 
相關問題