0

我有一个使用 ITextSharp 5.4.5.0 生成证书的 asp.net 应用程序。我有生成一个证书的代码工作正常,但是当我尝试将这些一页证书捆绑到一个多页 PDF 并将内存流输出到浏览器时,我从 Adob​​e Acrobat 收到一个错误。

我有一种感觉,我没有正确添加我的每个字节数组,但我很茫然。

这是调用代码:

        protected void btnMakeCerts_Click(object sender, EventArgs e)
    {
        ICAgileEntities icae = new ICAgileEntities();

        int classid =int.Parse(Request.QueryString["id"]);

        var currentClass = (from c in icae.Classes
                            where c.id == classid
                            select c).FirstOrDefault();

        Response.Clear();
        Response.BufferOutput = true;
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment; filename=AllCertificates-" + currentClass.Title + ".pdf");

        var pagesAll = new List<byte[]>();
        pagesAll = Helper.Certificate.ProcessClassCerts(classid);

        MemoryStream ms = new MemoryStream();
        PdfConcatenate whole = new PdfConcatenate(ms);

        foreach (byte[] pageAll in pagesAll)
        {
            PdfReader partReader = new PdfReader(pageAll);
            whole.AddPages(partReader);
            partReader.Close();
        }

        Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
        Response.Flush();
        Response.End(); 

    }

这将创建各个页面并返回一个字节数组:

public static List<byte[]> ProcessClassCerts(int classId)
    {
        var icae = new ICAgileEntities();

        string filename = DateTime.Now.ToString().Replace(@"/", "").Replace(":", "").Replace(" ", "") + ".pdf";
        string sFileDir = ConfigurationManager.AppSettings["ServerPath"] + (@"\images\sigs\");
        var currentClass = (from c in icae.Classes
                            where c.id == classId
                            select c).FirstOrDefault();

        //make the Instructor Names
        String instName = "test";

        var students = (from up in icae.UserProfiles
                        from cl in up.UserProfile_Class_Details
                        where cl.ClassId == classId && cl.IsCertPaid == true && cl.IsClassPaid == true
                        select up);

        var currentCourse = (from s in icae.Courses
                             where s.id == currentClass.CourseID
                             select s).FirstOrDefault();



        var pageBytes = (byte[])null;
        var pagesAll = new List<byte[]>();

        try
        {


            string path = ConfigurationManager.AppSettings["ServerPath"] + @"\PDFs\";


            int i = 1;
            foreach (var s in students)
            {
                PdfStamper pst = null;
                MemoryStream mstr = null;
                using (mstr = new MemoryStream())
                {
                    try
                    {
                        PdfReader reader = new PdfReader(path + @"\certFormPDF.pdf");  //new PdfReader(GetTemplateBytes());

                        pst = new PdfStamper(reader, mstr);
                        var acroFields = pst.AcroFields;

                        acroFields.SetField("Awardee Name", s.DisplayName);


                        pst.FormFlattening = true;
                        pst.SetFullCompression();

                    }
                    finally
                    {
                        if (pst != null)
                            pst.Close();
                    }
                }
                pageBytes = mstr.ToArray();
                pagesAll.Add(pageBytes);
                i++;
            }
        }
        finally
        {
        }

        return pagesAll;
    }

感谢您的任何帮助,您可以提供

4

0 回答 0