我试图在这里关注这篇文章:http://www.4guysfromrolla.com/articles/030911-1.aspx
我在Services.asmx中有这个方法:
[WebMethod]
public void CreatePdf()
{
// Create a Document object
var document = new Document(PageSize.A4, 50, 50, 25, 25);
// Create a new PdfWriter object, specifying the output stream
var output = new MemoryStream();
var writer = PdfWriter.GetInstance(document, output);
// Open the Document for writing
document.Open();
// Create a new Paragraph object with the text, "Hello, World!"
var welcomeParagraph = new Paragraph("Hello, World!");
// Add the Paragraph object to the document
document.Add(welcomeParagraph);
// Close the Document - this saves the document contents to the output stream
document.Close();
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment;filename=file.pdf");
HttpContext.Current.Response.BinaryWrite(output.ToArray());
}
我页面上的这个jQuery代码:
$('a.download').click(function () {
$.ajax({
type: "POST",
url: "/Services.asmx/CreatePdf",
data: '{}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
alert(result.d);
}
});
});
这应该创建一个pdf并将其流式传输到用户的浏览器。
当我点击类download
的链接时,我的网络方法会被点击并且代码会运行。它只是不将pdf流式传输到浏览器。
如果我查看Firebug,它会以状态200发布到我的方法,我收到此响应:
%PDF-1.4 % 2 0 obj <>流 X + R 25P 04WI 2P 5 1 BҸ4>>> / Contents 2 0 R / Parent 3 0 R>> endobj 1 0 obj <> endobj 3 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj 外部参照 0 7 0000000000 65535 f 0000000304 00000 0000000015 00000 0000000392 00000 0000000147 00000 0000000443 00000 0000000488 00000 预告片 << 21ba8d519bb56a2d0ec514bcb9c47169>]>> %iText的-5.3.5 startxref 646 %% EOF { “d”:空}
我在这里做错了吗?
答案 0 :(得分:4)
Marc B是对的。您需要使用pdf输出流来响应服务器端代码。
因此,请将下载链接指向一个新文件,例如PDFDownload.aspx,并将CreatePdf函数中的代码放在PDFDownload.aspx.cs的PageLoad中。
答案 1 :(得分:1)
使用xmlhttprequest时,您似乎无法接收二进制数据。 (这就是jquery所做的)。
当您执行form post
标准a href link
它应该有用。因为那时响应类型由浏览器处理......
确保在服务器上设置匹配的标题...
contentDisposition = "attachment=\"" name "";
contentType = "application/pdf";
希望这会有所帮助
答案 2 :(得分:1)
我这样做,就是这样:
页面aspx.cs中的方法
[WebMethod()]
public static string CreatePdf()
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 30f, 30f, 30f, 30f);
iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, ms);
doc.Open();
doc.Add(new iTextSharp.text.Chunk("hello world"));
doc.Close();
// convert ms to byte and Base64
return System.Convert.ToBase64String(ms.ToArray());
}
函数jQuery
$("#createPdf").click(function () {
//call ajax
$.ajax({
url: "main.aspx/CreatePdf",
data: '{}',
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (result) {
//pdf
var downloadpdf = $('<a id="downloadpdf" download="file.pdf" href="data:application/pdf;base64,' + result.d + '" >');
$('body').append(downloadpdf);
document.getElementById("downloadpdf").click();
$("#downloadpdf").remove();
},
error: function (req, status, error) {
alert(error);
}
});
});
我希望它对某人有帮助!