使用itextsharp将pdf流式传输到用户的浏览器

时间:2013-02-05 20:35:25

标签: c# jquery asp.net ajax itextsharp

我试图在这里关注这篇文章: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”:空}

我在这里做错了吗?

3 个答案:

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

我希望它对某人有帮助!