将pdf流式传输给用户';使用itextsharp的浏览器
本文关键字:使用 itextsharp 浏览器 pdf 传输 给用户 | 更新日期: 2023-09-27 17:57:55
我试着在这里关注这篇文章:https://web.archive.org/web/20211020001758/https://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
类的链接时,我的web方法就会被击中,代码就会运行。它只是不将pdf流式传输到浏览器。
如果我在Firebug中查看,它会发布到我的方法,状态为200,我会得到这个响应:
%PDF-1.4%����2 0对象<>流动x�+�r�25便士�04WI�2便士�5.��1.���BҸ4>>/内容2 0 R/父项3 0 R>>endobj1 0对象<>endobj3 0对象<>endobj5 0物镜<>endobj6 0物镜<>endobj外部参照0 70000000000065535 f0000000 30400000 n00000000150000000000000 39200000 n0000000 14700000 n0000000 443 00000 n0000000 48800000 n拖车<lt;21ba8d519bb56a24.1.1.14bcb9c47169>>%iText-5.3.5启动外部参照646%%EOF{"d":null}
我是不是做错了什么?
Marc B是正确的。您需要让服务器端代码使用pdf输出流进行响应。
因此,将下载链接指向一个新文件,如PDFDownload.aspx,并将CreatePdf函数中的代码放在PDFDownload.aspx的PageLoad中。
使用xmlhttprequest时,似乎无法接收二进制数据。(jquery就是这么做的)。当你做一个form post
一个标准的a href link
它应该起作用。因为响应类型由浏览器处理。。。
确保你在服务器上设置了匹配的标题,就像你做的那样…
contentDisposition = "attachment='"" name "";
contentType = "application/pdf";
希望这对有帮助
好吧,我这样做:
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);
}
});
});
我希望它能帮助到别人!