Как я могу назначить содержимое iTextSharp.text.Document либо байтовому массиву, либо потоку памяти?

У меня есть рабочий код в приложении ASP.NET Web API, которое загружает электронную таблицу Excel / файл.xls на компьютер пользователя, когда этот метод вызывается по нажатию на ссылку:

public HttpResponseMessage Get(string unit, string begindate, string enddate)
{
    byte[] excelContents;

    string selectStmt = "SELECT BinaryData FROM ReportsGenerated WHERE FileBaseName = @fileBaseName";
    string fbn = string.Format("deliveryperformance/{0}/{1}/{2}", unit, begindate, enddate);
    using (SqlConnection connection = new SqlConnection(PlatypusWebReportsConstsAndUtils.CPSConnStr))
    using (SqlCommand cmdSelect = new SqlCommand(selectStmt, connection))
    {
        cmdSelect.Parameters.Add("@fileBaseName", SqlDbType.VarChar).Value = fbn;
        connection.Open();
        excelContents = (byte[])cmdSelect.ExecuteScalar();
        connection.Close();
    }

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new ByteArrayContent(excelContents)
    };
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = string.Format("{0}.xlsx", fbn)
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

    return result;
}

Я хочу сделать практически то же самое из приложения ASP.NET MVC с помощью метода Controller следующим образом:

internal static HttpResponseMessage GeneratePDFOfReportFutures()
{
    HttpResponseMessage result = null;
    futureReports = GetAllFutureReports();
    try
    {
        using (var ms = new MemoryStream())
        {
            using (var doc = new Document(PageSize.A4.Rotate(), 25, 25, 25, 25))
            {
                using (PdfWriter.GetInstance(doc, ms))
                {
                    doc.Open();
                    . . .
                    doc.Add(tblHeadings);

                    foreach (QueuedReports qr in futureReports)
                    {
                        . . .
                        doc.Add(tblRow);
                    }

                    var bytes = ??? // This is the conundrum

                    result = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new ByteArrayContent(bytes)
                    };
                    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = string.Format("{0}.pdf", "test")
                    };
                    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                } // memoryStream
            } // doc
        } // pdfWriter                
    } // try
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return result;
} // GeneratePDFOfReportFutures

Таким образом, в случае файла Excel я уже записал данные в базу данных, а затем в методе GET выше я зачитал их обратно, присвоив содержимое этого поля в таблице байтовому массиву.

В случае файла PDF мне не нужно сначала сохранять данные в таблице, поэтому я просто хочу вырезать посредника БД и сохранить содержимое байтового массива в файл на компьютере пользователя. Проблема в том, что я не знаю, как назначить содержимое iTextSharp.text.Document байтовому массиву (см. Строку "???" в методе GeneratePDFOfReportFutures()).

В качестве альтернативы, как я могу назначить iTextSharp.text.Document для MemoryStream, а затем назначить taht для байтового массива следующим образом:

var bytes = ms.ToArray();

???

Так что мне нужно знать, как я могу назначить данные из iTextSharp.text.Document либо напрямую в байтовый массив, либо в MemoryStream?

0 ответов

Другие вопросы по тегам