2015-11-30 4 views
1

Я разрабатываю службу WCF, которая загружает PDF-файл с интернет-портала, преобразует его в массив байтов и отправляет его клиенту. На стороне клиента я преобразовываю этот массив байтов в pdf с помощью метода WriteAllBytes. Но при открытии документа в формате PDF он отображает «Существует ошибка при открытии documnet. Файл может быть поврежден или поврежден»Преобразование байтового массива в pdf вызывает ошибку при открытии dcoument

WCF код //

FileInformation fileInfo = File.OpenBinaryDirect(clientContext, fileRef.ToString()); 

byte[] Bytes = new byte[Convert.ToInt32(fileSize)]; 
fileInfo.Stream.Read(Bytes, 0, Bytes.Length); 
return Bytes; 

Клиентский код

byte[] recievedBytes = <call to wcf method returing byte array>; 
       File.WriteAllBytes(path, recievedBytes); 
+0

Ну вы сравнили оригинальный документ с загруженной версии, например с точки зрения размера и некоторого хэша? Мы могли бы действительно увидеть ваш код ... в настоящее время мы не имеем понятия, где может быть проблема. –

+0

Нет, укажите * * вопрос *. (Даже не ясно, был ли этот код вашим кодом клиента или кодом WCF, если честно ...) Вы также не ответили ни на один мой вопрос о сравнении, которые вы выполняли между файлами. –

+0

Да, я сравнил документы. Кажется, нет никакой разницы. – TheCoder

ответ

3

Я настоятельно подозреваю, что в этом проблема:

byte[] Bytes = new byte[Convert.ToInt32(fileSize)]; 
fileInfo.Stream.Read(Bytes, 0, Bytes.Length); 

Вы принимаете один звонок до Read будет читать все. Вместо этого вы должны пройти круг до тех пор, пока не найдете все. Например:

byte[] bytes = new byte[(int) fileSize]; 
int index = 0; 
while (index < bytes.Length) 
{ 
    int bytesRead = fileInfo.Stream.Read(bytes, index, bytes.Length - index); 
    if (bytesRead == 0) 
    { 
     throw new IOException("Unable to read whole file"); 
    } 
    index += bytesRead; 
} 

В качестве альтернативы:

MemoryStream output = new MemoryStream((int) fileSize]; 
fileInfo.Stream.CopyTo(output); 
return output.ToArray(); 
+0

Спасибо тонну. Это решило проблему. – TheCoder

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