使用Cordova打开pdf字节流文件

时间:2014-07-25 21:36:40

标签: jquery asp.net ajax itextsharp cordova-3

我的.net网络服务有一个创建iTextSharp PDF文档的方法。

我有一个基于Cordova / JqueryMobile的应用程序,它在其中一个视图上调用此方法。

Web服务将文档作为字节流发送。

我无法让Cordova应用程序显示该文件。

网络服务

<OperationContract()> _
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json)> _
Public Function GetPDF(ByVal accountID As Int64) As Byte()
    Dim myPDF As Document = New Document

    Dim msPDFData As MemoryStream = New MemoryStream()
    Dim writer As PdfWriter = PdfWriter.GetInstance(myPDF, msPDFData)
    myPDF.Open()
    myPDF.Add(New Paragraph("I'm a pdf!"))

    Dim pdfData As Byte() = msPDFData.ToArray()

    Return pdfData
End Function

很简单。

ajax调用

var dataString = JSON.stringify({
    accountID: '309'
});

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: '/GetPDF',
    data: dataString,
    processData: true,
    dataType: "json",
    success: function (response) {
    var reader = new FileReader();        
    reader.readAsArrayBuffer(response.d);
    reader.onloadend = function (evt) {
        console.log("read success");
        console.log(new Uint8Array(evt.target.result));
    };
    },
    error: function (a, b, c) {
        alert('file error')
    }
});

这不做任何事情。但是response.d确实包含了文档的字节。

我希望Cordova解析字节数组并打开PDF阅读器以显示文档,并选择保存文件。

我以为我可以使用FileTransfer.download Cordova方法,但示例有一个固定的uri,而我需要调用一个Web服务,但我还没能用我的ajax交换那个固定的uri打电话 - 所以我不知道这是不是答案。

1 个答案:

答案 0 :(得分:2)

我在Saurabh this SO question

的帮助下找到了答案

在我最初的实现中,我希望以某种方式直接从流中打开文件。但事实证明,您必须创建一个物理文件并将数据写入该文件然后打开它。

因此,我更新的代码将字节数组从webservice转换为二进制数组,然后将其写入文件:

var dte = getCurDateOnly(), fileData, UTF8_STR, BINARY_ARR, dataString = JSON.stringify({
    accountID: '309'
});

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: '/GetPDF',
    data: dataString,
    processData: true,
    dataType: "json",
    success: function (response) {
        fileData = response.d;
        UTF8_STR = new Uint8Array(response.d);  // Convert to UTF-8...                
        BINARY_ARR = UTF8_STR.buffer; // Convert to buffer...
        getFS();
    },
    error: function (a, b, c) {
        alert('file error')
    }
});

function getFS() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
}

function gotFS(fileSystem) {
    fileSystem.root.getDirectory("MyDIR", { create: true }, gotDir);
}

function gotDir(dirEntry) {
    dirEntry.getFile("MyFILE" + dte + ".pdf", { create: true, exclusive: false }, gotFile);
}

function gotFile(fileEntry) {
    fileEntry.createWriter(function (writer) {
        writer.onwrite = function (evt) {
            console.log("write success");
            listDir();
        };
        writer.write(BINARY_ARR);
    }, function (error) {
        console.log(error);
    });
}
function fail() {
    console.log('pdf fail function called');
}

感谢Saurabh最后一块拼图。