2017-02-07 2 views
0

У меня есть ответ с сервера, который содержит PDF. Что-то, как показано ниже (только что показали короткую отредактированную версию ниже):Как написать PDF-содержимое в строке в файл в java?

%PDF-1.4 
%???? 
9 0 obj 
%%EOF 

Используя эту строку или массив байтов, как я могу создать файл PDF?

я уже пытался использовать следующее, но она показывает пустые страницы в PDF

OutputStream oos = new FileOutputStream("test.pdf"); 
oos.write(b); 

Я могу видеть wholeString в консоли, которая длинная строка, начиная с% PDF-1.4 и заканчивая %% EOF , Я также пробовал читать 8192 байт и писать. Тем не менее такой же результат:

 byte[] buf = wholeString.getBytes(Charset.forName("UTF-8")); 

     OutputStream oos = new FileOutputStream(tpath); 

     InputStream is = new ByteArrayInputStream(buf); 
     int c = 0; 

     while ((c = is.read(buf, 0, buf.length)) > 0) { 
      System.out.println(); 
      oos.write(buf, 0, c); 
      oos.flush(); 
     } 

     oos.close(); 
     is.close(); 

Я использую EntityUtils, чтобы получить поток:

String responseBody = EntityUtils.toString(httpResponse.getEntity(), Charset.forName("UTF-8")); 

Конвертируемая строка затем отправляется в другой метод, где я пытаюсь записать его в файл.

+0

да. У меня есть oos.close() в конце. – Crusaderpyro

+3

Если у вас есть ответ с сервера, у вас есть байты. Вы не должны преобразовывать эти байты в строку, а затем конвертировать обратно в байты, если вы можете избежать этого. Это просто просят ошибок. –

+2

Заголовок должен выглядеть так: '% PDF-1.1 % ¥ ± ë'. Эти вопросительные знаки говорят мне, что вы испортили байты при преобразовании в строку. –

ответ

2

После обсуждения в комментариях, это должно решить непосредственную проблему:

byte[] entityBytes = EntityUtils.toByteArray(httpResponse.getEntity()); 
Files.write(Paths.get("test.pdf"), entityBytes); 

Все, что вступающий в вашей программе будет всегда приходят в виде байтов.

Если вы не получаете байты извне программы, это означает, что некоторые фреймворк или библиотека уже сделали декодирование, возможно, неправильно.

Имейте в виду, как правило, вы всегда должны избегать преобразования в строку, если:

  1. Вы не будете 100% уверены, что вам нужна строка. (PDF, JSON или XML должны храниться и анализироваться как байты, а не как строка)
  2. Вы на 100% уверены, что байты представляют собой строку. Это не так, поскольку байты представляют собой PDF, а не строку.
  3. Вы на 100% уверены, какую кодировку использовать для декодирования байтов в строке. PDF не является строкой UTF-8.
+0

@Aaron Это было в ответ на сообщение OP, что иногда данные с сервера не PDF, а XML или JSON. Я стараюсь быть как можно более тяжелым в своем предложении, чтобы не преобразовывать байты в строку, если вам это абсолютно не нужно, поскольку это так часто приводит к ошибкам, как показано. –

+0

Правильно, я забыл, что другие данные, которые он получал, были специально XML и JSON, поэтому я согласен, что нет смысла преобразовывать их в String по мере их получения с сервера. – Aaron

+0

Правильно. Байт-преобразование строк создавало проблему! – Crusaderpyro

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