2016-07-31 59 views
0

目前我正在混合應用程序中工作。我收到了base 64字符串,我想下載爲pdf,並在用戶點擊下載按鈕時打開它。我設法轉換爲pdf參考下面的鏈接 它正在存儲在設備的本地存儲。 在Android文件獲取存儲在內部存儲。但對於ios pdf是不是在本地存儲內部的accessibe和ibooks沒有識別該文件。如何在Android下載文件夾中提供pdf,爲ios提供ibooks以獲得更好的用戶體驗,並在下載完成後使pdf打開?pdf下載,爲ios和android顯示

convert base 64 to pdf 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; 
}; 

然後下載自己需要的科爾多瓦文件插件:

function pdfConversion(){ 
    alert("The paragraph was clicked."); 
var fileName="test.pdf"; 
var fileToSave= b64toBlob(encodedString, 'application/pdf'); 
document.addEventListener("deviceready", onDeviceReady, false); 
function onDeviceReady() { 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, onFileSystemFail); 
} 
function gotFS(fileSystem) { 
    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("inside local file system"+JSON.stringify(writer)); 
     alert("JSON.stringify(writer)"+JSON.stringify(writer)); 
     console.log("contents of file now 'some sample text'"); 
     //writer.truncate(11); 
     writer.onwriteend = function(evt) { 
      writer.write(fileToSave); 
      writer.seek(4); 
      } 

    writer.onerror = function (e) { 
     // you could hook this up with our global error handler, or pass in an error callback 
     console.log('Write failed: ' + e.toString()); 
    }; 
    writer.write(fileToSave); 
    window.open(fileName, '_blank'); 

    }; 

    function onFileSystemFail(error) { 
     console.log(error.code); 
    } 

}; 
+0

Android中打開PDF,我們能夠獲得寫入和讀取PDF文件。但在IOS中,Sand box訪問對讀取有一定的限制。所以我設法打開PDF使用編碼的字符串如下window.open(「data:application/pdf; base64,」+ encodedString,「_blank」,「location = no,hidden = no,closebuttoncaption = Close」); – Abinaya

回答

-1

在Android中,我們能夠獲得寫入和讀取PDF。但在IOS中,沙箱訪問有一定的限制。

我設法用編碼字符串如下

window.open("data:application/pdf;base64,"+encodedString, "_blank","location=no,hidden=no,closebuttoncaption=Close");