使用iText合并PDF并在客户端另存为流

时间:2015-10-29 16:48:34

标签: c# .net pdf itextsharp

我尝试使用我在这里找到的代码 http://web.archive.org/web/20111012184438/http://alex.buayacorp.com/merge-pdf-files-with-itext-and-net.html将两个或多个PDF文件合并为一个。

我希望实现输出作为流返回并保存在客户端。我试图修改代码但没有成功。代码尝试将输出保存在服务器上,然后导致未授权访问异常。 任何人都有正确的线索吗?

private void MergePDFs()
{
    DataSourceSelectArguments args = new DataSourceSelectArguments();
    DataView view = (DataView)SqlDataSource1.Select(args);

    DataTable table = view.ToTable();
    List<PdfReader> readerList = new List<PdfReader>();

    foreach (DataRow myRow in table.Rows)
    {
        PdfReader pdfReader = new PdfReader(Convert.ToString(myRow[0]));
        readerList.Add(pdfReader);
    }

    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, Response.OutputStream);
    document.Open();

    foreach (PdfReader reader in readerList)
    {
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            copy.AddPage(copy.GetImportedPage(reader, i));
        }
    }

    document.Close();
    Response.AppendHeader("content-disposition", "inline; filename=OutPut.pdf");
    Response.ContentType = "application/pdf";
}

1 个答案:

答案 0 :(得分:0)

您似乎正在使用OutputStream将PDF字节作为文件写入服务器磁盘。这通常是您在Web应用程序中不需要的东西。在Web应用程序中,您希望将字节写入Response对象,如iTextSharp generated PDF: How to send the pdf to the client and add a prompt?

的答案中所述

常识会告诉你最好直接在OutputStream的{​​{1}}上写字节,但经验告诉我们并非所有浏览器都能正确处理这些字节。最好先将PDF写入Response(如Create PDF in memory instead of physical file中所述)。一旦你在内存中有了字节,那么你可以在设置正确的HTTP头之后将字节刷新到MemoryStream对象尤其是Response 对某些浏览器来说很重要。)

很明显,您不能在未经用户同意的情况下将字节写入客户端,例如因为

  1. 这将是一种安全隐患。浏览器不应允许服务器将任何内容写入最终用户的磁盘。
  2. 您不知道最终用户的文件系统的组织(并非每台计算机都有ContentLength驱动器。)
  3. 如果您希望最终用户保存PDF,则应使用以下HTTP标头:

    C:

    想了解更多信息?阅读How To Write Binary Files to the Browser Using ASP.NET and Visual C# .NET

    额外的建议:请帮我一个忙,不要使用坏的iTextSharp示例。合并PDF是使用Response.AddHeader("Content-Disposition", "attachment; filename=yourfile.pdf"); PdfCopy完成的。下载免费电子书The Best iText Questions on StackOverflow,您将节省大量时间(1.)搜索答案和(2)避免错误答案。