使用itextSharp创建PDF文件

时间:2010-12-17 14:25:56

标签: asp.net itextsharp

您好  我正在创建一个ASP.net网站,可以上传一些文章。我需要我的用户可以通过点击按钮获得它的PDF版本。对于此功能,我使用itextSharp。     我正在考虑以下两个选项。 1.我将创建一次PDF文件(在第一次请求时),并通过检查它是否存在来重复使用它。 2.我将动态创建它,并在PDF文件传送到客户端后立即将其删除。 第一种方法将导致更快的PDF传输,而第二种方法将导致节省空间。谁能告诉我哪个选项更好?

我也想知道如果不首先在服务器上保存PDF就可以实现这一点。所以任何人都可以尽快回复我。

由于 DIPA

5 个答案:

答案 0 :(得分:2)

因此,通过始终生成文件来存储文件与节省磁盘空间,可以节省CPU周期。我建议保存CPU周期,因为添加磁盘存储既便宜又容易(可以在不使服务器脱机的情况下完成)。添加CPU相对更昂贵,通常需要使服务器脱机(取决于您的环境)。

选项1:首次请求时创建PDF

优点:

  • 除非有人下载PDF,否则不会创建PDF,因此在创建没有人想要的PDF时不会浪费CPU。
  • PDF是一个文件,因此IIS可以将其作为文件传输到客户端,可用于IIS缓存策略等。

缺点:

  • PDF文件占用磁盘空间。
  • 如果内容发生变化,需要标记PDF(或删除),否则PDF版本可能与文章不同步。

选项2:在每次请求时创建PDF

优点:

  • PDF始终与最新版本的文章保持同步。
  • 磁盘空间最小化。

缺点:

  • 如果许多用户请求下载PDF,服务器上的CPU负载会很大。
  • 无法使用IIS或其他Web服务器缓存策略。

答案 1 :(得分:2)

您绝对可以在不将其写入磁盘的情况下即时创建PDF。而不是使用FileStream使用MemoryString:

        'PDF Document'
        Dim document As New Document(PageSize.LETTER)
        'Use a memory string so we don't need to write to disk
        Using outputStream As New MemoryStream()
            'Associate the PDF with the stream
            Dim w = PdfWriter.GetInstance(document, outputStream)

            'Open the PDF for writing'
            document.Open()

            'Do PDF stuff Here'


            'Close the PDF'
            document.Close()
            'Clear the response buffer'
            Response.Clear()
            'Set the output type as a PDF'
            Response.ContentType = "application/pdf"
            'Disable caching'
            Response.AddHeader("Expires", "0")
            Response.AddHeader("Cache-Control", "")
            'Set the filename'
            Response.AddHeader("Content-Disposition", "attachment; filename=" & OutputFileName)
            'Set the length of the file so the browser can display an accurate progress bar'
            Response.AddHeader("Content-length", outputStream.GetBuffer().Length.ToString())
            'Write the contents of the memory stream'
            Response.OutputStream.Write(outputStream.GetBuffer(), 0, outputStream.GetBuffer().Length)
            'Close the response stream'
            Response.End()

        End Using

iTextSharp对我来说非常非常快。我在一个共享主机上,我可以生成相当复杂的数十页的PDF而不会发现任何迟缓。

修改 这是使用VB.Net to C#转换器转换的代码。我没有对它进行测试,你可能需要清理一些东西,但它应该非常简单。

Document document = new Document(PageSize.LETTER);
//Use a memory string so we don't need to write to disk
using (MemoryStream outputStream = new MemoryStream()) {
    //Associate the PDF with the stream
    dynamic w = PdfWriter.GetInstance(document, outputStream);

    //Open the PDF for writing'
    document.Open();

    //Do PDF stuff Here'


    //Close the PDF'
    document.Close();
    //Clear the response buffer'
    Response.Clear();
    //Set the output type as a PDF'
    Response.ContentType = "application/pdf";
    //Disable caching'
    Response.AddHeader("Expires", "0");
    Response.AddHeader("Cache-Control", "");
    //Set the filename'
    Response.AddHeader("Content-Disposition", "attachment; filename=" + OutputFileName);
    //Set the length of the file so the browser can display an accurate progress bar'
    Response.AddHeader("Content-length", outputStream.GetBuffer().Length.ToString());
    //Write the contents of the memory stream'
    Response.OutputStream.Write(outputStream.GetBuffer(), 0, outputStream.GetBuffer().Length);
    //Close the response stream'
    Response.End();

}

要在新窗口中打开PDF,请将链接按钮指向“CreatePDF.aspx”等页面。该页面应包含此代码。

答案 2 :(得分:0)

嗨Dipa 由于DarrellNoton说节省CPU周期很重要,我也同意这一点。没有人会等待很长时间才能准备好PDF,最终用户会希望它更快。

我建议您创建一次并将其作为二进制格式存储在DB中。这样您就可以快速访问它,并且每次创建新PDF所需的时间更短。 或者,您可以为PDf文件指定名称,并仅将名称存储在DB中。这个名字可以是一个指导。

希望这会对你有所帮助。谢谢:))

答案 3 :(得分:0)

如果您使用的是iTextSharp,则无法动态创建它。所以第二种选择似乎很好。如果要减少使用的服务器空间,可以运行一些Windows服务,这将从服务器中删除所有/较少使用的PDF。

我认为它可以解决你的两个问题。

答案 4 :(得分:0)

实际上它完全取决于应用程序的要求。就像我的应用程序一样,我不需要在服务器上保存pdf文件,所以在将pdf文件传送到客户端后我将其从服务器中删除。 因此,如果特定用户多次访问特定的pdf文件,那么您必须将其保存在服务器上,这样可以节省您的pdf生成时间。