C# iTextSharp生成PDF时如何指定文件保存至特定路径
问题说明
开发环境为Visual Studio 2012,基于ASP.NET WebForm实现ASPX页面内容转PDF功能,原功能可正常运行,原实现代码如下:
string attachment = "attachment; filename=" + FileName + ".pdf"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/pdf"; StringWriter s_tw = new StringWriter(); HtmlTextWriter h_textw = new HtmlTextWriter(s_tw); h_textw.AddStyleAttribute("font-size", "7pt"); h_textw.AddStyleAttribute("color", "Black"); pnlPrincipal.RenderControl(h_textw);//Name of the Panel Document doc = new Document(); doc = new Document(PageSize.A4, 5, 5, 15, 5); FontFactory.GetFont("Verdana", 80, iTextSharp.text.BaseColor.RED); PdfWriter.GetInstance(doc, Response.OutputStream); doc.Open(); StringReader s_tr = new StringReader(s_tw.ToString()); HTMLWorker html_worker = new HTMLWorker(doc); html_worker.Parse(s_tr); doc.Close(); Response.Write(doc);
当前问题:生成的PDF默认保存到用户本机C:/Users/[用户名]/Downloads下载文件夹,需要将PDF存储到自定义特定文件夹,需要明确代码修改位置。
解决方案
首先明确两个场景的差异,对应不同处理方式:
- 如果你要修改的是用户浏览器端下载PDF的默认保存路径:服务端代码无法实现,这是浏览器的安全限制,所有Web应用都无权指定用户本机的文件存储位置,该路径只能由用户自行修改浏览器下载设置,或在下载触发时手动选择保存位置。
- 如果你要把PDF存储到服务器端的自定义文件夹路径:只需要修改
PdfWriter绑定的输出流即可,原代码直接将PDF流写入Response.OutputStream推送给浏览器,替换为指向自定义路径的文件流就能实现服务器端存盘。
具体修改位置
核心修改点为原代码中PdfWriter.GetInstance(doc, Response.OutputStream);这一行,替换为自定义路径的文件流即可,完整修改示例如下:
StringWriter s_tw = new StringWriter(); HtmlTextWriter h_textw = new HtmlTextWriter(s_tw); h_textw.AddStyleAttribute("font-size", "7pt"); h_textw.AddStyleAttribute("color", "Black"); pnlPrincipal.RenderControl(h_textw);//Name of the Panel Document doc = new Document(PageSize.A4, 5, 5, 15, 5); FontFactory.GetFont("Verdana", 80, iTextSharp.text.BaseColor.RED); // --------------- 以下为自定义路径配置部分 --------------- // 配置自定义存储目录,以下示例为站点根目录下的PDFStorage文件夹,可自行替换为服务器绝对路径如@"D:\ServerPDFStore\" string customSaveDir = Server.MapPath("~/PDFStorage/"); // 目录不存在时自动创建 if (!Directory.Exists(customSaveDir)) { Directory.CreateDirectory(customSaveDir); } // 拼接PDF文件完整存储路径 string pdfFullPath = Path.Combine(customSaveDir, $"{FileName}.pdf"); // 绑定输出流到自定义路径的文件流 using (FileStream pdfFs = new FileStream(pdfFullPath, FileMode.Create)) { PdfWriter.GetInstance(doc, pdfFs); doc.Open(); StringReader s_tr = new StringReader(s_tw.ToString()); HTMLWorker html_worker = new HTMLWorker(doc); html_worker.Parse(s_tr); doc.Close(); } // --------------- 自定义路径配置部分结束 --------------- // 如果存到服务器后仍需要给用户提供下载,保留以下响应输出逻辑即可,不需要可直接删除 Response.ClearContent(); Response.AddHeader("content-disposition", $"attachment; filename={FileName}.pdf"); Response.ContentType = "application/pdf"; Response.WriteFile(pdfFullPath); Response.End();
注意事项
- 请确保Web应用运行的进程身份,对配置的自定义存储文件夹有写入权限,否则会抛出权限不足异常
- 不建议在生产环境写死本机绝对路径,优先使用
Server.MapPath映射Web应用内的相对路径,避免部署时路径不匹配 - 原代码末尾的
Response.Write(doc)为无效代码,doc是iTextSharp的文档对象,写入响应没有实际作用,可直接删除
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

