MemoryStream не может записать в другой MemoryStream
У меня проблема при записи из одного потока памяти в другой. Я использую пакет NuGet для преобразования PDF-файлов в PNG. Мне нужно сохранить изображения как строку base64. Когда я читаю pdf-файл, он правильно создает pdf-объект с правильным количеством ожидаемых страниц. После того, как я сохраню PDF-файл в потоке памяти, этот поток имеет длину (предположительно правильную, но сейчас я пытаюсь создать тестовую проверку). После того, как я отправлю поток туда, где он должен быть преобразован, путем копирования в другой поток, другой поток никогда не будет иметь никаких данных. Я попробовал два нижеприведенных подхода, один более сложный и один кратко-сладкий, основанный на темах, которые я нашел здесь.
Я не могу заставить свои потоки памяти писать друг в друга.
Это мой класс
class pdf
{
string localPath = @"C:\_Temp\MyForm.pdf";
public pdf()
{
var base64String = GenerateSampleFormBase64(localPath);
using(StreamWriter sw = new StreamWriter(@"C:\_Temp\log.txt"))
{
sw.WriteLine(base64String);
sw.Flush();
}
}
private static string GenerateSampleFormBase64(string path)
{
PdfDocument pdf = new PdfDocument(path);
MemoryStream msPdf = new MemoryStream();
pdf.Save(msPdf);
var x = ConvertPdfPageToPng(msPdf);
return Convert.ToBase64String(x);
}
static byte[] ConvertPdfPageToPng(MemoryStream msPng64)
{
// msPng64 length is 473923
string base64;
using(MemoryStream msPng = new MemoryStream(100))
{
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = msPng64.Read(buffer, 0, buffer.Length)) > 0)
{
msPng.Write(buffer, 0, bytesRead);
}
// msPng is always length 0
base64 = Convert.ToBase64String(msPng.GetBuffer(), 0, (int)msPng.Length);
byte[] raw = Convert.FromBase64String(base64);
if(raw.Length > 0)
return raw;
else
throw new Exception("Failed to write to memory stream.");
}
}
// This also did not work
public static string ConvertToBase64(MemoryStream stream)
{
byte[] bytes;
using(var memoryStream = new MemoryStream(100))
{
stream.CopyTo(memoryStream);
bytes = memoryStream.ToArray();
}
return Convert.ToBase64String(bytes);
}
}
1 ответ
Вы используете метод PdfDocument.Save(), но он сохраняет PDF, а не PNG. Вместо этого вам нужно использовать PdfPage.Save. Этот пример кода показывает, как сгенерировать изображение PNG в Base64 для первой страницы документа PDF:
using (var pdf = new PdfDocument(path))
{
PdfDrawOptions options = PdfDrawOptions.Create();
options.BackgroundColor = new PdfRgbColor(255, 255, 255);
options.Compression = ImageCompressionOptions.CreatePng();
string base64 = ConvertPdfPageToBase64Png(pdf.Pages[0], options);
File.WriteAllText("page0_base64.txt", base64);
}
private static string ConvertPdfPageToBase64Png(PdfPage page, PdfDrawOptions options)
{
using (var stream = new MemoryStream())
{
page.Save(stream, options);
return Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);
}
}