Как конвертировать base64 в pdf?
Учитывая ввод base64, как мне преобразовать его в файл PDF в Android?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_main);
// Get the PDF file to encode it into Base64
File file = new File("/mnt/sdcard/download/Base64.pdf");
try {
// Files is from Guava library
Files.toByteArray(file);
// Encoded into Base64
byte[] temp = Base64.encode(Files.toByteArray(file), Base64.DEFAULT);
// For testing purposes, wrote the encoded string to file
writeToFile(Base64.encodeToString(temp, Base64.DEFAULT).toString());
} catch (IOException e) {
Log.d(tag, "File.toByteArray() error");
e.printStackTrace();
}
}
Я смог использовать http://www.webutils.pl/index.php?idx=base64 для проверки правильности кодирования PDF-файла. Но я хотел бы иметь возможность декодировать base64 обратно в PDF сам. Как бы я это сделал?
Редактировать 1
Попробовал приведенный ниже код в соответствии с предложением Saneesh CS
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
setContentView(R.layout.activity_main);
// Get the PDF file to encode it into Base64
File file = new File("/mnt/sdcard/download/Base64.pdf");
try {
// Files is from Guava library
Files.toByteArray(file);
// Encoded into Base64
byte[] temp = Base64.encode(Files.toByteArray(file), Base64.DEFAULT);
// Tried with the below line, but same result.
byte[] temp1 = Base64.encode(Files.toByteArray(file), 0);
// For testing purposes, wrote the encoded string to file
// writeToFile(Base64.encodeToString(temp, Base64.DEFAULT).toString());
final File dwldsPath = new File(Environment.getExternalStorageDirectory(), "test7.pdf");
byte[] pdfAsBytes = Base64.decode(temp, 0);
FileOutputStream os;
os = new FileOutputStream(dwldsPath, false);
os.write(pdfAsBytes);
os.flush();
os.close();
} catch (IOException e) {
Log.d(tag, "File.toByteArray() error");
e.printStackTrace();
}
}
Над кодом работает.
3 ответа
Решение
final File dwldsPath = new File(DOWNLOADS_FOLDER + fileName + ".pdf");
byte[] pdfAsBytes = Base64.decode(txt, 0);
FileOutputStream os;
os = new FileOutputStream(dwldsPath, false);
os.write(pdfAsBytes);
os.flush();
os.close();
Попробуйте этот код. txt - строка в кодировке base64.
Этот код может помочь вам. Я запустил этот код, и он работает отлично.
public static GetFilePathAndStatus getFileFromBase64AndSaveInSDCard(String base64, String filename,String extension){
GetFilePathAndStatus getFilePathAndStatus = new GetFilePathAndStatus();
try {
byte[] pdfAsBytes = Base64.decode(base64, 0);
FileOutputStream os;
os = new FileOutputStream(getReportPath(filename,extension), false);
os.write(pdfAsBytes);
os.flush();
os.close();
getFilePathAndStatus.filStatus = true;
getFilePathAndStatus.filePath = getReportPath(filename,extension);
return getFilePathAndStatus;
} catch (IOException e) {
e.printStackTrace();
getFilePathAndStatus.filStatus = false;
getFilePathAndStatus.filePath = getReportPath(filename,extension);
return getFilePathAndStatus;
}
}
public static String getReportPath(String filename,String extension) {
File file = new File(Environment.getExternalStorageDirectory().getPath(), "ParentFolder/Report");
if (!file.exists()) {
file.mkdirs();
}
String uriSting = (file.getAbsolutePath() + "/" + filename + "."+extension);
return uriSting;
}
public static class GetFilePathAndStatus{
public boolean filStatus;
public String filePath;
}
это решение у меня работает на Котлине
private fun setPdfDownload(bill: BillDataPdfOutput){
if (bill.data != null) {
val file = File(getFilePath("pdf_name"))
try {
FileOutputStream(file).use { fos ->
val decoder = Base64.getDecoder().decode(bill.data)
fos.write(decoder)
Toast.makeText(this, "downloading success", Toast.LENGTH_LONG).show()
}
} catch (e: Exception) {
e.printStackTrace()
}
}else {
Log.v("PDF", "not download " + bill.message)
}
}
fun getFilePath(filename: String): String {
val file =
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path)
if (!file.exists()) {
file.mkdirs()
}
return file.absolutePath.toString() + "/" + filename + ".pdf"
}