C# ITextSharp向memoryStream添加多个PDFSTamper

C# ITextSharp向memoryStream添加多个PDFSTamper,c#,asp.net,.net,itextsharp,pdfstamper,C#,Asp.net,.net,Itextsharp,Pdfstamper,我有一个asp.net应用程序,它使用ITextSharp 5.4.5.0生成证书。我有生成一个证书的代码,但当我试图将这些单页证书捆绑到一个多页PDF中并将memorystream输出到浏览器时,Adobe Acrobat出现了一个错误 我有一种感觉,我并没有正确地添加每个字节,但我不知所措 以下是呼叫代码: protected void btnMakeCerts_Click(object sender, EventArgs e) { ICAgileEn

我有一个asp.net应用程序,它使用ITextSharp 5.4.5.0生成证书。我有生成一个证书的代码,但当我试图将这些单页证书捆绑到一个多页PDF中并将memorystream输出到浏览器时,Adobe 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(); 

    }
受保护的无效btnMakeCerts\u单击(对象发送方,事件参数e)
{
ICAgileEntities icae=新的ICAgileEntities();
int classid=int.Parse(Request.QueryString[“id”]);
var currentClass=(来自icae.Classes中的c
其中c.id==classid
选择c).FirstOrDefault();
Response.Clear();
Response.BufferOutput=true;
Response.ClearHeaders();
Response.ContentType=“application/pdf”;
AddHeader(“内容处置”,“附件;文件名=所有证书-”+currentClass.Title+“.pdf”);
var pagesAll=新列表();
pagesAll=Helper.Certificate.ProcessClassCerts(classid);
MemoryStream ms=新的MemoryStream();
PdfConcatenate整体=新的PdfConcatenate(ms);
foreach(字节[]pageAll在pagesAll中)
{
PdfReader partReader=新PdfReader(pageAll);
整个.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;
    }
公共静态列表ProcessClassCerts(int-classId)
{
var icae=新的ICAgileEntities();
字符串文件名=DateTime.Now.ToString().Replace(@“/”,“”)。Replace(“:”,“”)。Replace(“,”“)+”.pdf”;
字符串sFileDir=ConfigurationManager.AppSettings[“ServerPath”]+(@“\images\sigs\”);
var currentClass=(来自icae.Classes中的c
其中c.id==classId
选择c).FirstOrDefault();
//把讲师的名字写出来
字符串instName=“test”;
var students=(在icae.UserProfiles中从上到下)
从up.UserProfile\u Class\u详细信息中的cl
其中cl.ClassId==ClassId&&cl.iscertpayed==true&&cl.IsClassPaid==true
选择“向上”;
var currentCourse=(来自icae.Courses中的s
其中s.id==currentClass.CourseID
选择s).FirstOrDefault();
var pageBytes=(byte[])null;
var pagesAll=新列表();
尝试
{
字符串路径=ConfigurationManager.AppSettings[“服务器路径”]+@“\PDFs\”;
int i=1;
foreach(学生中的var s)
{
PdfStamper pst=null;
MemoryStream mstr=null;
使用(mstr=newmemoryStream())
{
尝试
{
PdfReader=newpdfReader(path+@“\certFormPDF.pdf”);//newpdfReader(GetTemplateBytes());
pst=新PdfStamper(读卡器,mstr);
var acroFields=pst.acroFields;
acroFields.SetField(“获奖者名称”,s.DisplayName);
pst.formflatting=真;
pst.SetFullCompression();
}
最后
{
如果(pst!=null)
pst.Close();
}
}
pageBytes=mstr.ToArray();
pagesAll.Add(页字节);
i++;
}
}
最后
{
}
返回pagesAll;
}

感谢您提供的任何帮助

在您关闭整个之前,结果PDF尚未完全创建;但是,您可以使用结果,而不这样做。另一个缺陷是您在
内存流上调用
GetBuffer()
,而不是
ToArray()
,请参见此