2015-04-06 2 views
1

У меня есть представление, которое создает PDF-документ. Он отлично работает в браузерах (рабочий стол), но моя конечная цель - доставить его на Android-приложение.Получение ответа в формате PDF от сервера с модифицированием

Сейчас я использую модифицированную библиотеку для обработки моих запросов/ответов (только json).

Моя проблема - тип данных Мне нужно передать Callback<> для обработки/получения данных PDF, а затем сохранить его на диск?

+0

дооснащения предназначен для общения с веб-службами. Если у вас есть URL-адрес, который является только документом (например, PDF), я бы использовал что-то еще для его загрузки (например, OkHttp, 'HttpURLConnection'). – CommonsWare

+0

CommonsWear прав, но вы можете попытаться настроить его, написав собственный конвертер, который вернет 'TypedByteArray'. Посмотрите это, с небольшими изменениями вы можете его достичь: http://stackoverflow.com/questions/28165438/get-base64-image -using-retrofit-error-com-google-gson-jsonsyntaxexception-java/28186334 # 28186334 –

+0

@NikolaDespotoski ok, это почти то, что я хочу. Я не думаю, что мне нужно разобрать его на TypedByteArray, но я буду тестировать. Другая проблема заключается в том, как я могу настроить ее как пользовательский конвертер? Я знаю, что есть метод, называемый ** setConverter **, и он принимает экземпляр конвертера, но код, на который вы ссылаетесь, не показывает пустой конструктор. Итак, как я могу установить? – vyscond

ответ

2

Для каждого человека интересно способ сделать это, вот мой рабочий процесс:

1 - После создания файла PDF захватить байт и преобразовать его в base64 строку.

я могу легко сделать это с помощью питона pyfpdf LIB и используя Django в качестве бэк-энда:

import base64 

def my_view(request): 
    pdf = MyCustomPDF() 
    pdf.add_page() 
    pdf.set_margins(12,3,3) 
    pdf.render() # PDF is ready to be saved 
    b = pdf.output('output.pdf','B') # got the PDF as a byte array 
    return JsonResponse(
     { 
      "name" : "my_doc.pdf", 
      "content64" : base64.b64encode(b).decode('utf8') 
     } 
    ) 

запомнить этот пример можно сделать с помощью других движков/ЛИЭС!

2 - На вашем Android-проекте установлена ​​строка на модели, которую вы хотите использовать для получения ответа/обратного вызова в формате PDF. Таким образом, наш PDF-файл будет таким.

{ 
    "name" : "my_doc.pdf", 
    "content64" : "aGVsbG8gd29ybGQ=" 
} 

Так что на Java можно установить пользовательский Pojo

class PDF{ 
    private String name; 
    private String content64; 

    // (...) 
} 

3 - base64 будет простой строка! Чтобы получить реальный файл как байты просто написать программу, как этот

class PDF{ 
    private String name; 
    private String content64; 

    // (...) 

    public byte[] content64AsByteArray(){ // Helps you convert string to byte formats :B 
     return Base64.decode(content64,Base64.DEFAULT); 
    } 

    public String save(String path) { 

     try { 

      String path = Environment.getExternalStorageDirectory() + "/" + path; 

      File f1 = new File(path); 

      OutputStream out = null; 
      out = new FileOutputStream(path + "/" + this.name); 
      out.write(this.content64AsByteArray()); 
      out.close(); 


     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return this.path; // I like to return it because i can use it to start a "open file" intent 
    } 
} 

4 - приема обратного вызова будет, как это с модифицированной

pdfCallback = new Callback<PDF>() { 

    @Override public void success(PDF pdf, Response response) { 

     if (response.getStatus() == 200) { 

      String pathToPDF = pdf.save() // save PDF 

     } 

    } 

    @Override public void failure(RetrofitError error) { 
     (...) 
    } 
} 

MyAPI.callbacks.getPDF((...), pdfCallback);