我想在cordova应用程序中下载PDF文件。我收到的是那个PDF的base64字符串。
我使用cordova-plugin-file和cordova-plugin-file-opener2尝试了下一个代码:
openPDF(invoice) {
this.saveAndOpenPdf(invoice['base64'], 'invoice.pdf');
}
saveAndOpenPdf(pdf: string, filename: string) {
const load = this.loadingCtrl.create({
content: this.translate.instant("app.loading"),
dismissOnPageChange: true
});
load.present();
var writeDirectory = this.platform.is('ios') ? this.file.dataDirectory : this.file.externalRootDirectory;
console.log(writeDirectory);
var self = this;
this.checkPermissions()
.then(() => {
var res = this.b64toBlob(pdf, 'aplication/pdf', 512);
console.log(res);
( < any > window).resolveLocalFileSystemURL(writeDirectory, function(dir) {
console.log("Access to the directory granted succesfully");
dir.getFile(filename, {
create: true
}, function(file) {
console.log("File created succesfully.");
file.createWriter(function(fileWriter) {
console.log("Writing content to file");
fileWriter.write(res);
self.opener.open(writeDirectory + filename, 'application/pdf').then(() => {
load.dismiss();
})
.catch((err) => {
console.error(err);
console.log('Error opening pdf file');
load.dismiss();
});
}, function() {
load.dismiss();
alert('Unable to save file in path ' + writeDirectory);
});
});
});
}).catch((error) => {
load.dismiss();
console.log(error);
});
}
b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {
type: contentType
});
return blob;
}
似乎正常,但是当打开器尝试打开PDF时,它失败并且PDF大小为0B。 (仅ANDROID )
我在做什么错了?
添加:
我也尝试了这篇文章中介绍的解决方案:https://stackoverflow.com/a/49137874/8228843
在这种情况下,在android中,只有在android中,file.writeFile函数什么都不做。 Promise无效,并且then()代码未执行,也不是catch()代码。重要的是要注意,控制台或logcat中都没有错误。
帖子中的解决方案代码说明:
saveAndOpenPdf(pdf: string, filename: string) {
const writeDirectory = this.platform.is('ios') ? this.file.dataDirectory : this.file.externalDataDirectory;
this.file.writeFile(writeDirectory, filename, this.convertBase64ToBlob(pdf, 'data:application/pdf;base64'), {replace: true})
.then(() => {
this.loading.dismiss();
this.opener.open(writeDirectory + filename, 'application/pdf')
.catch(() => {
console.log('Error opening pdf file');
this.loading.dismiss();
});
})
.catch(() => {
console.error('Error writing pdf file');
this.loading.dismiss();
});
}
convertBaseb64ToBlob(b64Data, contentType): Blob {
contentType = contentType || '';
const sliceSize = 512;
b64Data = b64Data.replace(/^[^,]+,/, '');
b64Data = b64Data.replace(/\s/g, '');
const byteCharacters = window.atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return new Blob(byteArrays, {type: contentType});
}