Подтвердить что ты не робот

Сохранение PDFsharp в MemoryStream

Я хочу сохранить PdfSharp.Pdf.PdfDocument с помощью метода Save в Stream, но он не привязывает к нему настройки заголовка PDF. Поэтому, когда я читаю Stream и возвращаю его пользователю, он видит, что файл PDF недействителен. Есть ли решение для установки параметров заголовка PDF, когда PDFsharp сохраняет в памяти?

4b9b3361

Ответ 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);
}

Есть этот материал MigraDoc, который поставляется с PdfSharp, но я едва нашел подходящий документ /faq для него. После нескольких часов работы в Интернете я нашел фрагмент, который был чем-то вроде этого. Теперь он работает.

Ответ 2

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

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

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

В ранних версиях PDFsharp не reset позиция потока.

Итак, вам нужно позвонить

ms.Seek(0, SeekOrigin.Begin); 

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

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

Изменить 2: вместо stream.ToArray() может быть более эффективным использование stream.GetBuffer(), но этот буфер обычно больше, чем PDF файл, и вам нужно использовать только stream.Length байты из этого буфера. Очень полезно для метода, который принимает byte[] вместе с параметром длины.

Ответ 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 Solution. Но для меня это работает так:

        MemoryStream ms = new MemoryStream();
        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            
        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;