android - 在 phonegap 中将 base64 字符串转换为 pdf

标签 android cordova pdf base64 phonegap-plugins

在我的应用程序中,我收到了一个表示 PDF 的 base64 字符串。我希望用户能够将 base64 以 pdf 格式保存到他的手机中。我一直在寻找 cordova-file-transfer插件,但这需要一个可以从中下载文件的(服务器)路径,而不是转换 base64 字符串。

有人使用 base64 字符串在 phonegap 中成功下载 pdf 吗?

最佳答案

经过更多的搜索和尝试,我发现了一些有用的东西。

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;
};

然后下载本身我们需要 cordova-file插件:

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)
}

关于android - 在 phonegap 中将 base64 字符串转换为 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273685/

相关文章:

php - TCPDF - 如果 pdf 页面处于横向或纵向模式,如何在页眉/页脚功能中检测?

android - Android 中有没有一种方法可以在不安装应用程序的情况下创建地理围栏接近警报?

android - 如何检测ScrollView的触摸事件?

Android:以编程方式添加的 TableLayout 中的 View 未显示

java - 为什么下载的文件会损坏?

ruby-on-rails - Datalogics PDF 填写 Rails

android - SwipeRefreshLayout 阻止嵌套 RecyclerView 中项目的 onClickCallback

html - 在 WP8 Cordova 应用程序中禁用内容反弹 - disallowoverscroll 不起作用

android - 使用 evothings 插件订阅 BLE 通知

android - 带有 Android Studio 的 Cordova webview(找不到文件 :///android_asserts/www/index. html)