Jquery 使用Cordova打开pdf字节流文件
我有一个.NETWeb服务,它有一个创建iTextSharp PDF文档的方法 我有一个基于Cordova/JqueryMobile的应用程序,它在一个视图上调用这个方法 web服务以字节流的形式发送文档 我无法让Cordova应用程序显示该文件 网络服务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
<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');
}