Convert base64 string as pdf in phonegap

后端 未结 1 1215
陌清茗
陌清茗 2021-01-25 05:53

In my app I have received a base64 string that represents a PDF. I want the user to be able to save the base64 as a pdf to his phone. I have been looking in to the cordova-file-

相关标签:
1条回答
  • 2021-01-25 06:29

    After some more searching and trying I found something that worked.

    Converting base64 to pdf blob

    //Helper function that converts base64 to blob
    function b64toBlob(b64Data, contentType, sliceSize) {
        var input = b64Data.replace(/\s/g, ''),
            byteCharacters = atob(input),
            byteArrays = [],
            offset, slice, byteNumbers, i, byteArray, blob;
    
        contentType = contentType || '';
        sliceSize = sliceSize || 512;
    
        for (offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            slice = byteCharacters.slice(offset, offset + sliceSize);
    
            byteNumbers = new Array(slice.length);
            for (i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }
    
            byteArray = new Uint8Array(byteNumbers);
    
            byteArrays.push(byteArray);
        }
    
        //Convert to blob. 
        try {
            blob = new Blob(byteArrays, { type: contentType });
        }
        catch (e) {
            // TypeError old chrome, FF and Android browser
            window.BlobBuilder = window.BlobBuilder ||
                                 window.WebKitBlobBuilder ||
                                 window.MozBlobBuilder ||
                                 window.MSBlobBuilder;
            if (e.name == 'TypeError' && window.BlobBuilder) {
                var bb = new BlobBuilder();
                for (offset = 0; offset < byteArrays.length; offset += 1) {
                    bb.append(byteArrays[offset].buffer);
                }                    
                blob = bb.getBlob(contentType);
            }
            else if (e.name == "InvalidStateError") {
                blob = new Blob(byteArrays, {
                    type: contentType
                });
            }
            else {
                return null;
            }
        }
    
        return blob;
    };
    

    And then the downloading itself we need the cordova-file plugin:

    var fileToSave= b64toBlob(fileData, 'application/pdf'); 
    writeFile();
    
    function writeFile() {
        console.log("request file system");
        window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemRetrieved, onFileSystemFail);
    }
    
    function onFileSystemRetrieved(fileSystem) {
        console.log("file system retrieved");
        fileSystem.root.getFile(fileName, { create: true }, onFileEntryRetrieved, onFileSystemFail);
    }
    
    function onFileEntryRetrieved(fileEntry) {
        console.log("file entry retrieved");
        fileEntry.createWriter(gotFileWriter, onFileSystemFail);
    }
    
    function gotFileWriter(writer) {
        console.log("write to file");
    
        writer.onwrite = function (evt) {
            alert('done');
        }
        writer.write(fileToSave);
    
        window.open(fileName, '_blank');
    }
    function onFileSystemFail(error) {
        console.log(error.code);
        alert(error.code)
    }
    
    0 讨论(0)
提交回复
热议问题