问题描述:
我现在选中多条记录,然后导出PDF,正确的结果应该是导出多条PDF。但是实际只导出了一个PDF。劳烦各位大佬帮忙看看,有没有处理方案。我折腾了两三天了,硬是没能解决,在线等,万分感激,谢谢。补充:总共就剩下20分了,分数有点少,实在抱歉。源码:#region 下载PDF
        /// <summary>
        /// 下载PDF
        /// </summary>
        /// <param name="applicationFormIDs">简历ID</param>
        /// <param name="resumeSubmitID">投递ID</param>
        /// <param name="resumeType">招聘类型:SocialRecruit:社招;SchoolRecruit:校招;Abbott:委培;OrderRecruit:订单班</param>
        /// <returns></returns>
        public void GetExportPdfPath(string applicationFormIDs)
        {
            List<string> applicationFormIDList = applicationFormIDs.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();            var paras = _dao.QueryDictionaries("Resume.ApplicationForm.GetExportPDFPara",
                new { ApplicationFormIDs = applicationFormIDList });            for (int i = 0; i < paras.Count; i++)
            {
                string pdfTitle = string.Empty;
                string exportName = string.Empty;//导出文件名字:投递岗位+姓名+身份证号后四位                Guid applicationFormID = new Guid(paras[i]["ApplicationFormID"].ToString());
                Guid resumeSubmitID = new Guid(paras[i]["resumeSubmitID"].ToString());
                string resumeType = paras[i]["ResumeType"].ToString();                string positionName = paras[i]["PositionName"].ToString();//岗位
                string candidateName = paras[i]["CandidateName"].ToString();//姓名
                string idCardNo = paras[i]["IDcardNo"].ToString();//身份证
                string idCardNoFourDigit = idCardNo.Substring(idCardNo.Length - 4, 4);//身份证后四位                exportName = positionName + candidateName + idCardNoFourDigit;//导出文件名字:投递岗位+姓名+身份证号后四位                using (MemoryStream ms = new MemoryStream())
                {
                    using (Document document = new Document())
                    {
                        PdfWriter.GetInstance(document, ms);
                        document.Open();
                        StreamUtil.AddToResourceSearch(Assembly.Load("iTextAsian"));
                        StreamUtil.AddToResourceSearch(Assembly.Load("iTextAsianCmaps"));
                        string fontName = base.Page.Request.Url.Scheme + "://" + base.Page.Request.Url.Host + ":" + base.Page.Request.Url.Port + "/App_Themes/blue_dt/Fonts/simfang.ttf";                        var title = string.Empty;
                        switch (resumeType)
                        {
                            case "SocialRecruit"://社招
                                pdfTitle = "福州地铁集团有限公司福州地铁" + "\n" + "社会招聘报名登记表";//PDF标题
                                title = ExportSocialRecruitPdf(applicationFormID, resumeSubmitID, resumeType, document, fontName, pdfTitle, exportName);
                                break;
                            case "SchoolRecruit"://校招
                                pdfTitle = "福州地铁集团有限公司福州地铁" + "\n" + "校园招聘报名登记表";//PDF标题
                                title = ExportSchoolRecruitPdf(applicationFormID, resumeSubmitID, resumeType, document, fontName, pdfTitle, exportName);
                                break;
                            case "Abbott"://委培
                                pdfTitle = "福州地铁集团有限公司福州地铁" + "\n" + "委培招聘报名登记表";//PDF标题
                                title = ExportSchoolRecruitPdf(applicationFormID, resumeSubmitID, resumeType, document, fontName, pdfTitle, exportName);
                                break;
                            case "OrderRecruit"://订单班
                                pdfTitle = "福州地铁集团有限公司福州地铁" + "\n" + "订单班招聘报名登记表";//PDF标题
                                title = ExportOrderRecruitPdf(applicationFormID, resumeSubmitID, resumeType, document, fontName, pdfTitle, exportName);
                                break;
                        }                        string fileName = string.Format("{0}.pdf", title);
                        fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
                        document.Close();
                        base.Page.Response.ContentType = "application/pdf";
                        base.Page.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
                        base.Page.Response.Clear();
                        base.Page.Response.BinaryWrite(ms.GetBuffer());
                        base.Page.Response.End();
                    }
                }
            }
        }
        #endregion

解决方案 »

  1.   

    你都Response.End() 了说明请求结束了
      

  2.   

    你好,那请问要怎么改呢?如果不Response.End(),会报错。
      

  3.   

    你好,请问把多个文件打成压缩包,这个怎么实现?有具体的demo吗?谢谢,急着上线,没很多时间研究。最好可以复制一下,参考一下
      

  4.   

    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Checksums;  下载一个ICSharpCode.SharpZipLib.dll public class ZipHelp
        {
             /// <summary>    
            /// 压缩文件夹    
            /// </summary>    
            /// <param name="dirPath">要打包的文件夹</param>    
            /// <param name="GzipFileName">目标文件名</param>    
            /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
            public static void ZIPDirectory(string dirPath, string GzipFileName, int CompressionLevel)
            {
                using (ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName)))
                {
                    s.SetLevel(6);
                    Compress(dirPath, s);
                    s.Finish();
                    s.Close();
                }
            }
            /// <summary>
            /// 压缩
            /// </summary>
            /// <param name="source">源目录</param>
            /// <param name="s">ZipOutputStream对象</param>
            public static void Compress(string source, ZipOutputStream s)
            {
                string[] filenames = Directory.GetFileSystemEntries(source);
                string inputfilepath = string.Empty;
                foreach (string file in filenames)
                {
                    if (Directory.Exists(file))
                    {
                        Compress(file, s);  //递归压缩子文件夹
                    }
                    else
                    {
                        using (FileStream fs = File.OpenRead(file))
                        {
                            byte[] buffer = new byte[4 * 1024];
                            //ZipEntry entry = new ZipEntry(file.Replace(Path.GetPathRoot(file), ""));     //此处去掉盘符,如D:\123\1.txt 去掉D:
                            inputfilepath = file.Substring(file.LastIndexOf("\\", file.LastIndexOf("\\")-1));
                            ZipEntry entry = new ZipEntry(inputfilepath); 
                            entry.DateTime = DateTime.Now;
                            s.PutNextEntry(entry);                        int sourceBytes;
                            do
                            {
                                sourceBytes = fs.Read(buffer, 0, buffer.Length);
                                s.Write(buffer, 0, sourceBytes);
                            } while (sourceBytes > 0);
                        }
                    }
                }
            } 
            /// <summary>  
            /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略)  
            /// </summary>  
            /// <param name="dirPath">被压缩的文件夹夹路径</param>  
            /// <param name="zipFilePath">生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip</param>  
            /// <param name="err">出错信息</param>  
            /// <returns>是否压缩成功</returns>  
            public static bool ZipFile(string dirPath, string zipFilePath, out string err)
            {
                err = "";
                if (dirPath == string.Empty)
                {
                    err = "要压缩的文件夹不能为空!";
                    return false;
                }
                if (!Directory.Exists(dirPath))
                {
                    err = "要压缩的文件夹不存在!";
                    return false;
                }
                //压缩文件名为空时使用文件夹名+.zip  
                if (zipFilePath == string.Empty)
                {
                    if (dirPath.EndsWith("//"))
                    {
                        dirPath = dirPath.Substring(0, dirPath.Length - 1);
                    }
                    zipFilePath = dirPath + ".zip";
                }            try
                {
                    string[] filenames = Directory.GetFiles(dirPath);
                    using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
                    {
                        s.SetLevel(9);
                        byte[] buffer = new byte[4096];
                        foreach (string file in filenames)
                        {
                            ZipEntry entry = new ZipEntry(Path.GetFileName(file));
                            entry.DateTime = DateTime.Now;
                            s.PutNextEntry(entry);
                            using (FileStream fs = File.OpenRead(file))
                            {
                                int sourceBytes;
                                do
                                {
                                    sourceBytes = fs.Read(buffer, 0, buffer.Length);
                                    s.Write(buffer, 0, sourceBytes);
                                } while (sourceBytes > 0);
                            }
                        }
                        s.Finish();
                        s.Close();
                    }
                }
                catch (Exception ex)
                {
                    err = ex.Message;
                    return false;
                }
                return true;
            }  
              /// <summary>
             /// ZIP:解压一个zip文件
              /// 
              /// </summary>
              /// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>
              /// <param name="TargetDirectory">解压到的目录</param>
              /// <param name="Password">解压密码</param>
              /// <param name="OverWrite">是否覆盖已存在的文件</param>
             public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true)
             {
                 //如果解压到的目录不存在,则创建目录
                 if (!System.IO.Directory.Exists(TargetDirectory))
                 {
                     Directory.CreateDirectory(TargetDirectory);
                 }
                 //目录结尾
                 if (!TargetDirectory.EndsWith("\\")) { TargetDirectory = TargetDirectory + "\\"; }
     
                 using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))
                 {
                    zipfiles.Password = Password;
                     ZipEntry theEntry;
     
                    while ((theEntry = zipfiles.GetNextEntry()) != null)
                     {
                        string directoryName = "";
                         string pathToZip = "";
                         pathToZip = theEntry.Name;
     
                        if (pathToZip != "")
                             directoryName = Path.GetDirectoryName(pathToZip) + "\\";
     
                         string fileName = Path.GetFileName(pathToZip);
     
                         Directory.CreateDirectory(TargetDirectory + directoryName);
     
                         if (fileName != "")
                        {
                            if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName)))
                             {
                                 using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName))
                                 {
                                     int size = 2048;
                                     byte[] data = new byte[2048];
                                     while (true)
                                     {
                                         size = zipfiles.Read(data, 0, data.Length);
     
                                        if (size > 0)
                                             streamWriter.Write(data, 0, size);
                                         else
                                             break;
                                     }
                                    streamWriter.Close();
                                 }
                             }
                         }
                     }                 zipfiles.Close();
                 }
            }
        }
      

  5.   

    你好,我现在这边得到的是多个ms.GetBuffer(),有办法直接利用多个ms.GetBuffer()压缩压缩包吗?我看了一下,貌似很多都是先把文件流保存到服务器文件夹,然后再压缩文件夹。 using (MemoryStream ms = new MemoryStream())
                    {
                        using (Document document = new Document())
                        {
                            PdfWriter.GetInstance(document, ms);
                            document.Open();
                            StreamUtil.AddToResourceSearch(Assembly.Load("iTextAsian"));
                            StreamUtil.AddToResourceSearch(Assembly.Load("iTextAsianCmaps"));
                            string fontName = base.Page.Request.Url.Scheme + "://" + base.Page.Request.Url.Host + ":" + base.Page.Request.Url.Port + "/App_Themes/blue_dt/Fonts/simfang.ttf";                        string fileName = string.Format("{0}.pdf", title);
                            fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
                            document.Close();                        //base.Page.Response.ContentType = "application/pdf";
                            //base.Page.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
                            //base.Page.Response.Clear();
                            base.Page.Response.BinaryWrite(ms.GetBuffer());//返回从其创建此流的无符号字节数组。
                            //base.Page.Response.End();
                        }
                    }
      

  6.   

    错了,ZipOutputStream s = new ZipOutputStream这是压缩文件的流,这个直接压缩流我还没试过。
      

  7.   

    我是用Document生成PDF的,这种情况怎么生成文件,然后保存到服务器呢?
      

  8.   

     using (FileStream fs = File.OpenRead(file))
                            {
                                int sourceBytes;
                                do
                                {
                                    sourceBytes = fs.Read(buffer, 0, buffer.Length);
                                    s.Write(buffer, 0, sourceBytes);
                                } while (sourceBytes > 0);
                            }这里原先是从文件流里读,往s里写,你换成从你的流里读,看看行不行。
      

  9.   

    ms.GetBuffer()这是个[]byte,转成Stream,可以生成文件,百度一下就行。
      

  10.   

    任何网站的"批量下载"都不会同时下载多个文件..你可以参考一下网盘里面的下载 或者邮件中的下载..都是把你选中的文件打包成rar下载.. 名字就叫  aaa,bbb,ccc等多个文件.rar至于操作呢  你可以这样..你不是有ms了吗.. 可以转换成byte[]. 完了使用file.writeallbytes("xxx.pdf") 来转换成文件转换之后的路径  你记录一下到list<string> 里.然后调用第三方SharpZipLib  把刚刚那几个pdf路径传进去 打包成xxxx.rar.然后你在跳转到这个rar地址 或者使用流的方式 都可以实现下载,.