Для каждого человека интересно способ сделать это, вот мой рабочий процесс:
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);
дооснащения предназначен для общения с веб-службами. Если у вас есть URL-адрес, который является только документом (например, PDF), я бы использовал что-то еще для его загрузки (например, OkHttp, 'HttpURLConnection'). – CommonsWare
CommonsWear прав, но вы можете попытаться настроить его, написав собственный конвертер, который вернет 'TypedByteArray'. Посмотрите это, с небольшими изменениями вы можете его достичь: http://stackoverflow.com/questions/28165438/get-base64-image -using-retrofit-error-com-google-gson-jsonsyntaxexception-java/28186334 # 28186334 –
@NikolaDespotoski ok, это почти то, что я хочу. Я не думаю, что мне нужно разобрать его на TypedByteArray, но я буду тестировать. Другая проблема заключается в том, как я могу настроить ее как пользовательский конвертер? Я знаю, что есть метод, называемый ** setConverter **, и он принимает экземпляр конвертера, но код, на который вы ссылаетесь, не показывает пустой конструктор. Итак, как я могу установить? – vyscond