2016-07-31 40 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");