2009-07-02 2 views
25

Я хочу сохранить PdfSharp.Pdf.PdfDocument по методу сохранения в поток, но он не прикрепляет к нему настройки заголовка PDF. Поэтому, когда я читаю Stream и возвращаю его пользователю, он видит, что файл PDF недействителен. Есть ли решение для присоединения настроек заголовка PDF, когда PDFsharp сохраняет в памяти?PDFsharp save to 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? Это то же самое, что и документ? –

+0

это сработало для меня вот так: pdfRenderer.Document = doc; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save (поток); – vicentedealencar

+0

Что такое pDoc ???? – Zafar

30

Если вы считаете, что есть проблема с PdfDocument.Save, сообщите об этом на форуме PDFsharp (но, пожалуйста, уточните свое описание ошибки). Ваше «решение» выглядит как хак для меня. «pdfRenderer.Save» вызывает «PdfDocument.Save» внутри. Независимо от проблемы - ваше «решение» по-прежнему вызывает ту же самую процедуру сохранения.

Edit: Чтобы получить байт [], содержащий файл PDF, вам нужно только позвонить:

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

Ранние версии PDFsharp не сбрасывают положение потока.

Таким образом, вы должны вызвать

ms.Seek(0, SeekOrigin.Begin); 

сбросить позицию потока перед чтением из потока; это больше не требуется для текущих версий.

Использование ToArray часто может использоваться вместо чтения из потока.

Edit 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 

}