我的.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打电话 - 所以我不知道这是不是答案。
答案 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最后一块拼图。