iText C# 合并PDF文件流,以及A5变A4时内容默认放在最底下的问题的解决方法;ASP.NET 实现Base64文件流下载PDF
2018-03-24 10:02 狼人:-) 阅读(1123) 评论(0) 编辑 收藏 举报
/// <summary> 合併PDF檔(集合) </summary> /// <param name="files">欲合併PDF檔之集合(一筆以上)</param> /// <param name="pagesize">纸张大小</param> public static MemoryStream mergePDFStream(MemoryStream[] files, Rectangle pagesize = null) { //outMergeFile = Server.MapPath(outMergeFile); //if (outMergeFile == null) //{ // outMergeFile = "d:\\" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + new Random().Next(1000) + ".pdf"; //} PdfReader reader; Document document; if (pagesize == null) { pagesize = PageSize.A4; } document = new Document(pagesize); //var fs = new FileStream(outMergeFile, FileMode.Create); MemoryStream fs = new MemoryStream(); //BufferedStream bfs = new BufferedStream(fs); PdfWriter writer = PdfWriter.GetInstance(document, fs); writer.CloseStream = false; //不自动关闭内存流. document.Open(); PdfContentByte cb = writer.DirectContent; PdfImportedPage newPage; for (int i = 0; i < files.Length; i++) { //这里的是,读取字节流 reader = new PdfReader(files[i].ToArray()); int iPageNum = reader.NumberOfPages; for (int j = 1; j <= iPageNum; j++) { document.NewPage(); newPage = writer.GetImportedPage(reader, j); //cb.Add(newPage); //cb.MoveTo(0, 0); // PageSize.A4.Height - newPage.Height 解决itext 高度的问题. itext 的y 轴默认是从下面开始 cb.AddTemplate(newPage, 0, pagesize.Height - newPage.Height); } } document.Close(); byte[] fileBuffer = fs.GetBuffer(); return fs; }
//Base64文件流 byte[] buffer = Convert.FromBase64String(decodedString); System.IO.Stream iStream = new System.IO.MemoryStream(buffer); try { int length; long dataToRead; string filename = sn + ".pdf";//保存的文件名称 dataToRead = iStream.Length; Response.Clear(); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "application/pdf"; //文件类型 Response.AddHeader("Content-Length", dataToRead.ToString());//添加文件长度,进而显示进度 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); while (dataToRead > 0) { if (Response.IsClientConnected) { length = iStream.Read(buffer, 0, 10000); Response.OutputStream.Write(buffer, 0, length); Response.Flush(); buffer = new Byte[10000]; dataToRead = dataToRead - length; } else { dataToRead = -1; } } } catch (Exception ex) { Response.Write("文件下载时出现错误!"); } finally { if (iStream != null) { iStream.Close(); } //结束响应,否则将导致网页内容被输出到文件,进而文件无法打开 Response.Flush(); Response.End(); }
声明:此博有部分内容为转载,版权归原作者所有~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2017-03-24 线程中使用SaveFileDialog不能弹出窗体
2016-03-24 AWS邮件通知服务:实时监控邮件状态