PDFsharp сохраняют к MemoryStream

В подкасте Переполнения стека было упомянуто SE-радио . Это довольно подробно.

Также, если Вы - стремящийся разработчик JavaScript, Douglas Crockford "Язык программирования JavaScript" и "Усовершенствованный JavaScript" переговоры о , театр Разработчика YUI превосходен. Существует несколько других драгоценных камней на подкасте также.

31
задан Je suis Monica - or maybe not 30 June 2015 в 07:57
поделиться

2 ответа

Итак, решение:

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, но я не нашел для него подходящей документации / часто задаваемых вопросов. После нескольких часов поиска в Google я нашел примерно такой фрагмент. Теперь это работает.

26
ответ дан 27 November 2019 в 21:43
поделиться

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

Изменить: Чтобы получить байт [], содержащий файл 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 байтов из этого буфера. Очень полезно для метода, который принимает байт [] вместе с параметром длины.

41
ответ дан 27 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: