Как я могу назначить содержимое 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?