2016-06-01 1 views
0

Я извлекаю файл SGML и извлекаю данные из него с помощью uuDecoder, и я создаю PDF из него.Некоторые файлы uuEncoded неправильно декодируются в C#

Он работает отлично с многих лет, но с последних нескольких месяцев мы наблюдаем, что некоторые из файлов PDF не могут загружаться, и в нем говорится: «Не удалось загрузить документ PDF» в хром.

Я прошел через это под вопрос, который имеет что-то похожее на мой случай, но это в Python, и я его в C#

How can we figure out why certain uuencoded files are not decoding properly using Python?

Вот пример текстового файла, который был внедренным UUENCODED PDF, который имея вопрос: https://www.sec.gov/Archives/edgar/data/1631661/000163166116000004/0001631661-16-000004.txt

Мой uuDecoder код алгоритма точно похож на это: http://blog.stevex.net/2004/04/c-classes-to-decode-yenc-and-uuencode-encoded-usenet-binaries/

я узнал, что он бросает индекс из исключения диапазона ниже в коде, где он ожидает 61 символов в строке, но некоторые из линий не имеет точных 61 chacters:

public static byte[] uuDecode(string buffer) 
     { 
      // Create an output array 
      byte[] outBuffer = new byte[(buffer.Length-1)/4*3]; 
      int outIdx = 0; 

      // Get the string as an array of ASCII bytes 
      byte[] asciiBytes = Encoding.ASCII.GetBytes(buffer); 

      for (int i=0; i<asciiBytes.Length; i++) 
      { 
       asciiBytes[i] = (byte)((asciiBytes[i]-0x20) & 0x3f); 
      } 

      // Convert each block of 4 input bytes into 3 
      // output bytes 
      for (int i = 1; i <= (asciiBytes.Length-1); i += 4) 
      { 
       outBuffer[outIdx++] = (byte)(asciiBytes[i] << 2 | asciiBytes[i+1] >> 4); 
       outBuffer[outIdx++] = (byte)(asciiBytes[i+1] << 4 | asciiBytes[i+2] >> 2); 
       outBuffer[outIdx++] = (byte)(asciiBytes[i+2] << 6 | asciiBytes[i+3]); 
      } 

      return outBuffer; 
     } 

Пожалуйста, обратите внимание, что нет ничего связанные с исключением «Index out of range» здесь, поэтому, пожалуйста, не перенаправляйте это туда.

Я попытался заполнить недостающие символы с пробелами, как показано ниже:

if (line.Length < 61) ////Making sure length is 61 characters 
       { 
        var builder = new StringBuilder(); 
        builder.Append(line); 
        var missing = 61 - line.Length; 

        for (int i = 0; i < missing; i++) 
        { 
         builder.Append(" "); 
        } 

        line = builder.ToString(); 

       } 

Может кто-то пожалуйста, помогите мне получить, почему это не работает для нескольких PDF документа?

+0

Отправьте код и пример, который воспроизводит проблему. «Почти похоже» означает, что мы не можем найти ошибок, вызванных различиями. –

+0

Это тот же алгоритм, теперь, если он отвечает на вашу проблему @PanagiotisKanavos – Neel

+0

Стоит ли здесь ставить полный алгоритм здесь @PanagiotisKanavos? – Neel

ответ

1

Я думаю, что проблема в пространствах. Улучшенный uuEncode использует `` (код 0x60) вместо пространства (0x20), которое можно обрезать. Попробуйте поместить все строки справа на полный размер. Попробуйте это преобразование (pdf.uue является UUENCODED часть файла - от begin к end):

 string[] all = File.ReadAllLines(@"d:\tmp\pdf.uue"); 
     for (int i = 1; i < all.Length - 2; i++) 
     { 
      if (all[i].Length < 61) 
       all[i] = all[i].PadRight(61, ' '); 
     } 
     File.WriteAllLines(@"d:\tmp\pdf-2.uue", all); 

Цикл является 1 .. Length-2 пропустить начать/конечные строки.

+0

Я не получаю, вы можете объяснить, пожалуйста, более подробно – Neel

+0

@Neel Протестируйте мой пример. Я использовал WinRar для uudecode исходной uuencoded, и полученные PDF-файлы были неправильными. После исправления они выглядят нормально. – i486

+0

Я предполагаю, что вы заполнили оставшиеся недостающие символы пустым полем? – Neel

Смежные вопросы