Jquery 使用Cordova打开pdf字节流文件

Jquery 使用Cordova打开pdf字节流文件,jquery,asp.net,ajax,itextsharp,cordova-3,Jquery,Asp.net,Ajax,Itextsharp,Cordova 3,我有一个.NETWeb服务,它有一个创建iTextSharp PDF文档的方法 我有一个基于Cordova/JqueryMobile的应用程序,它在一个视图上调用这个方法 web服务以字节流的形式发送文档 我无法让Cordova应用程序显示该文件 网络服务 <OperationContract()> _ <WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json)> _ Public Function

我有一个.NETWeb服务,它有一个创建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
这没什么用。但是response.d确实包含文档的字节

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


我想我可以使用FileTransfer.download Cordova方法,但是这个例子有一个固定的uri,而我需要调用一个web服务,我还不能用ajax调用交换这个固定的uri,所以我不知道这是否是答案。

我在Saurabh at的帮助下找到了答案

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

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

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

感谢您提供了拼图的最后一部分。

您是否已验证生成的是有效的PDF?最后,我记得在使用文档之前,您需要对文档调用
Close()
。您是否在Cordova方面遇到异常或其他情况?谢谢,我没有对文档调用close()。我已经用JPEG图像尝试过,但似乎不太管用。如果我将image.src设置为使用writer.write函数编写的文件,它只会显示一个小的灰色框,而不是实际的图像。有什么建议吗?
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');
}