В подкасте Переполнения стека было упомянуто SE-радио . Это довольно подробно.
Также, если Вы - стремящийся разработчик JavaScript, Douglas Crockford "Язык программирования JavaScript" и "Усовершенствованный JavaScript" переговоры о , театр Разработчика YUI превосходен. Существует несколько других драгоценных камней на подкасте также.
Итак, решение:
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 я нашел примерно такой фрагмент. Теперь это работает.
Если вы считаете, что существует проблема с 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
байтов из этого буфера. Очень полезно для метода, который принимает байт []
вместе с параметром длины.