您好 我正在创建一个ASP.net网站,可以上传一些文章。我需要我的用户可以通过点击按钮获得它的PDF版本。对于此功能,我使用itextSharp。 我正在考虑以下两个选项。 1.我将创建一次PDF文件(在第一次请求时),并通过检查它是否存在来重复使用它。 2.我将动态创建它,并在PDF文件传送到客户端后立即将其删除。 第一种方法将导致更快的PDF传输,而第二种方法将导致节省空间。谁能告诉我哪个选项更好?
我也想知道如果不首先在服务器上保存PDF就可以实现这一点。所以任何人都可以尽快回复我。
由于 DIPA
答案 0 :(得分:2)
因此,通过始终生成文件来存储文件与节省磁盘空间,可以节省CPU周期。我建议保存CPU周期,因为添加磁盘存储既便宜又容易(可以在不使服务器脱机的情况下完成)。添加CPU相对更昂贵,通常需要使服务器脱机(取决于您的环境)。
选项1:首次请求时创建PDF
优点:
缺点:
选项2:在每次请求时创建PDF
优点:
缺点:
答案 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生成时间。