C# ITextSharp向memoryStream添加多个PDFSTamper
我有一个asp.net应用程序,它使用ITextSharp 5.4.5.0生成证书。我有生成一个证书的代码,但当我试图将这些单页证书捆绑到一个多页PDF中并将memorystream输出到浏览器时,Adobe Acrobat出现了一个错误 我有一种感觉,我并没有正确地添加每个字节,但我不知所措 以下是呼叫代码: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
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()
,请参见此