Я хочу сохранить PdfSharp.Pdf.PdfDocument с помощью метода Save в Stream, но он не привязывает к нему настройки заголовка PDF. Поэтому, когда я читаю Stream и возвращаю его пользователю, он видит, что файл PDF недействителен. Есть ли решение для установки параметров заголовка PDF, когда PDFsharp сохраняет в памяти?
Сохранение PDFsharp в MemoryStream
Ответ 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[]
вместе с параметром длины.
Ответ 3
Я нашел более простое решение:
byte[] fileContents = null;
using(MemoryStream stream = new MemoryStream())
{
pdfDoc.Save(stream, true);
fileContents = stream.ToArray();
}
Ответ 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;