C# передача byte[] файла pdf из приложения в другое и обратное преобразование

Рейтинг: 0Ответов: 1Опубликовано: 18.07.2023

Есть pdf файл, который парсится в массив byte[] в консольном приложении и выводится значение на консоль.

    static void Main(string[] args)
    {
        if (args.Count() < 1)
            return;

        string fileName = args[0];
        string publicAddress = "someaddress";

        if (!Directory.Exists(publicAddress))
        {
            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.FileName = "cmd.exe ";

            startInfo.Arguments = " /C" + @" net use Z: \ *some commands*";
            process.StartInfo = startInfo;
            Process.Start(startInfo);
        }

        DirectoryInfo dir = new DirectoryInfo(publicAddress);

        var file = dir.GetFiles(fileName).FirstOrDefault();

        if (file == null)
        {
            Console.WriteLine("File not found");
        }
        else
        {
            byte[] bytes = System.IO.File.ReadAllBytes(file.FullName);
            Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes));
        }            
    }

С другой стороны приложение считывает поток данных из строки, которое преобразует данную строку обратно в массив байтов с помощью и пытается вернуть заново собранную pdf. Но совпадают только количество страниц - в основном, они пустые.

                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.FileName = @"C:\Dist\GetBytesOfFile\GetBytesOfFile.exe";
                startInfo.Arguments = fileName;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.RedirectStandardOutput = true;
                startInfo.RedirectStandardError = false;

                Process p = Process.Start(startInfo);

                string output = p.StandardOutput.ReadToEnd();

                p.WaitForExit();

                int exitCode = p.ExitCode;

                byte[] bytes = Encoding.UTF8.GetBytes(output);               

                using (MemoryStream stream = new MemoryStream())
                {
                    stream.Write(bytes, 0, bytes.Length);
                    stream.Position = 0;
                    return new FileStreamResult(stream, "application/pdf") { FileDownloadName = fileName };
                }

Что я упускаю при создании FileResultStream?

Ответы

▲ 2Принят

Encoding.UTF8.GetString(bytes) - двоичные файлы так не получится передать в stdout. Преобразование в текст произойдёт с потерей данных.

Можно либо так

Console.Out.BaseStream.Write(bytes);

Читать такое тоже через StandardInput.BaseStream придётся точно так же как любой другой двоичный поток, никаких ReadToEnd, только цикл с буфером.

Либо перекодировать в Base64

Console.Write(Convert.ToBase64String(bytes));

А при приёме перекодировать обратно

byte[] bytes = Convert.FromBase64String(output);