Ошибочное UTF8 преобразование файла PDF (c#) - PullRequest
0 голосов
/ 08 апреля 2020

Разработчику было поручено отправить PDF-файлы на FTP-сайт. Случайно каждый PDF-файл читался как строка, кодировался в байтовый массив UTF-8 и затем передавался на FTP. Очевидно, это вызвало проблемы, поскольку файлы PDF НЕ ТЕКСТ.

Ниже приведен код, который был выполнен:

//method passed in a filepath to use for the upload
var filePath = @"C:\temp\myFile.pdf";
byte[] pdfBytes;
using (var sr = new StreamReader(filePath))
{
    pdfBytes = Encoding.UTF8.GetBytes(sr.ReadToEnd());
}
//byte array was then uploaded

Мой вопрос: есть ли способ отменить этот тип повреждения на на основе файла? Можете ли вы взять поврежденный PDF, прочитать его байты и каким-то образом превратить его в «строку PDF»? (Я знаю, что PDF-файлы не являются строками. Просто пытаюсь выяснить, можно ли исправить коррупцию)

ПРИМЕЧАНИЕ. Мы уже исправили код и получаем байты, как показано ниже. Просто хочу узнать, есть ли способ отменить то, что было сделано.

var pdfBytes = File.ReadAllBytes(filePath);

1 Ответ

1 голос
/ 08 апреля 2020

Я собираюсь сказать "нет" ... Вот бок о бок с dummy.pdf W3 C (слева) и после записи байтов обратно на диск после вашего процесса искажения (на справа):

enter image description here

Вы можете видеть, что большая часть байтов слева заменена на EE BF BD - символ замены. Это означает, что даже при увеличении размера файла большие части исходного файла были утеряны (в нижней части скриншота вы можете увидеть некоторые незашифрованные элементы, которые были сохранены). Возможно, вы сможете восстановить текст, встроенный в файл, но текст, который был растеризован в изображение, рисунок и другие объекты, вероятно, будет утерян

Вот код, который я использовал для создания второго файла:

            var filePath = @"C:\temp\dummy.pdf";
            byte[] pdfBytes;
            using (var sr = new StreamReader(filePath))
            {
                pdfBytes = Encoding.UTF8.GetBytes(sr.ReadToEnd());
            }
            File.WriteAllBytes(@"C:\temp\dummy2.pdf", pdfBytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...