将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}

我是不是做错了什么?

将pdf流式传输给用户';使用itextsharp的浏览器

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

我希望它能帮助到别人!