Как записать PDF в HttpResponseMessage с помощью iText 7 - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь сгенерировать PDF и записать его в ответ HTTP, используя библиотеки iText 7 и iText7.pdf Html.

Содержимое HTML для PDF хранится в объекте StringBuilder.

Не уверен, каков правильный процесс, потому что, как только я использую HtmlConverter.ConvertToPdf, MemoryStream закрыто, и я не могу получить доступ к байтам. Я получаю следующее исключение:

System.ObjectDisposedException: не удается получить доступ к закрытому потоку.

HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
StringBuilder htmlText = new StringBuilder();
htmlText.Append("<html><body><h1>Hello World!</h1></body></html>");
using (MemoryStream memoryStream = new MemoryStream())
{
    using (PdfWriter pdfWriter = new PdfWriter(memoryStream))
    {
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        Document document = new Document(pdfDocument);

        string headerText = "my header";
        string footerText = "my footer";

        pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, new HeaderFooterEventHandler(document, headerText, footerText));

        HtmlConverter.ConvertToPdf(htmlText.ToString(), pdfWriter);

        memoryStream.Flush();
        memoryStream.Seek(0, SeekOrigin.Begin);

        byte[] bytes = new byte[memoryStream.Length];
        memoryStream.Read(bytes, 0, (int)memoryStream.Length);

        Stream stream = new MemoryStream(bytes);
        httpResponseMessage.Content = new StreamContent(stream);

        httpResponseMessage.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/pdf");
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "sample.pdf"
        };
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
    }//end using pdfwriter
}//end using memory stream

РЕДАКТИРОВАТЬ Добавлено PdfDocument и Document объекты для манипулирования верхним / нижним колонтитулом и новой страницей.

1 Ответ

1 голос
/ 18 января 2020

Используйте тот факт, что у вас есть MemoryStream и замените

    memoryStream.Flush();
    memoryStream.Seek(0, SeekOrigin.Begin);

    byte[] bytes = new byte[memoryStream.Length];
    memoryStream.Read(bytes, 0, (int)memoryStream.Length);

на

byte[] bytes = memoryStream.ToArray();

Этот метод документирован также для работы с закрытыми потоками памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...