将第二页添加到动态生成的pdf中

时间:2016-03-08 12:31:46

标签: c# pdf-generation itextsharp

我有一个场景,我需要根据他们加入的课程为学生生成证书。如果学生加入单一课程,则颁发单证书,如果学生加入多门课程,则单页pdf包含多个页面(每个页面将有每个课程的单独证书)。

以下代码可帮助我为单个课程生成pdf。如何为多个课程生成pdf。如果有多个课程,那么下一页也应该使用位于路径的相同模板:

  

使用Server.Mappath("〜/模板/ CertificateTemplate.pdf&#34);

我正在使用itextsharp库来创建文档。以下是用于生成pdf的代码。

 string formFile = Server.MapPath("~/Template/CertificateTemplate.pdf")                                        
 string newFile = Server.MapPath("~/Certificates/" + _dbRegistration.RegistrationNumber + ".pdf");

 PdfReader reader = new PdfReader(formFile);
 PdfStamper stamper = new PdfStamper(reader, new FileStream(
                        newFile, FileMode.Create));

 var pdfContentBuffer = stamper.GetOverContent(1);

 AcroFields fields = stamper.AcroFields;
 fields.SetField("ID", _dbRegistration.RegistrationNumber);
 fields.SetField("Course", _dbRegistration.Course.FirstOrDefault().Name);
 ...
 stamper.FormFlattening = true;
 stamper.Close();

我想在以下条件下附加pdf

for(int i=0;i<course.count;i++)
{
     AcroFields fields = stamper.AcroFields;
     fields.SetField("ID", _dbRegistration.RegistrationNumber);
     fields.SetField("Course",   _dbRegistration.Course[i].Name);
     ...
}

2 个答案:

答案 0 :(得分:2)

请允许我更新您的代码。阅读作为评论添加的部分,了解有关我更改内容的更多信息。

string formFile = Server.MapPath("~/Template/CertificateTemplate.pdf")                                        
string newFile = Server.MapPath("~/Certificates/"
_dbRegistration.RegistrationNumber + ".pdf");

PdfReader reader = new PdfReader(formFile);
PdfStamper stamper = new PdfStamper(reader, new FileStream(
                        newFile, FileMode.Create));

// You don't need this function here!
// var pdfContentBuffer = stamper.GetOverContent(1);

AcroFields fields = stamper.AcroFields;
fields.SetField("ID", _dbRegistration.RegistrationNumber);
...
...
stamper.FormFlattening = true;

// You can't reuse a PdfReader object when you're using PdfStamper,
// so let's create a new instance:
PdfReader reader2 = new PdfReader(formFile);
// Let's assume that your document only has one page,
// and add a second page that has the same size as the first page:
stamper.InsertPage(2, reader2.GetPageSize(1));
// Now we get the PdfContentByte of that second page:
var cb = stamper.GetOverContent(2);
// And we add the content of the first page at position 0, 0
cb.AddTemplate(stamper.GetImportedPage(reader2, 1), 0, 0);

stamper.Close();
// Don't forget to close the PdfReader instances!
reader.Close();
reader2.Close();

现在您将拥有一个PDF,其中第一页包含添加了字段的模板;第二页将是没有字段的相同模板,这正是您所寻找的(在您的问题的第1版中)。

<强>更新

在您的问题的第二个版本中,您现在要说您要创建一个由多个页面组成的PDF,其中使用不同的字段数据集重复相同的表单。

以下视频教程详细解释了如何执行此操作:https://www.youtube.com/watch?v=6YwDME0Fl1c

可以在此处找到本教程的示例:Using forms for reporting。如果您浏览这些示例,您就会明白有不同的方法可以实现这一目标。

首先连接表单,然后填写字段

这不是最优雅的方式,但您可以将表单与自身连接起来,以便它有两页。这不优雅,很容易出错。这是在这个问题中解释的:http://developers.itextpdf.com/question/how-merge-forms-different-files-one-pdf

第一个障碍是您需要通知PdfCopy您正在合并包含表单字段的文档(如果您不这样做,则字段会丢失)。第二个障碍是您必须重命名字段,因为与只有一个名称的字段对应的两个窗口小部件注释只能有一个值。

我不建议使用这种方法。

首先填充并展平,然后连接

我对问题How to merge forms from different files into one PDF?的回答的第二部分进行了解释。它也在这里回答:iTextSharp filling forms and creating multiple pages或者,如果您不理解Java代码并且更喜欢C#代码:Multipage PDF document from predefined template

答案 1 :(得分:-3)

以下函数创建页面并插入更多页面,以便输出pdf具有多个4的页面

这里使用了itextsharp dll

var tempFileLocation = Path.GetTempFileName();
string sourcePdfPath =" pdf file path here";    
var bytes = File.ReadAllBytes(sourcePdfPath);

using (var reader = new PdfReader(bytes))
{
    var numberofPages = reader.NumberOfPages;
    var modPages = (numberofPages % 4);
    var pages = modPages == 0 ? 0 : 4 - modPages;

    if (pages == 0)
        return;

    using (var fileStream = new FileStream(tempFileLocation, FileMode.Create, FileAccess.Write))
    {
        using (var stamper = new PdfStamper(reader, fileStream))
        {
            var rectangle = reader.GetPageSize(1);
            for (var i = 1; i <= pages; i++)
                stamper.InsertPage(numberofPages + i, rectangle);
        }
    }
}

File.Delete(sourcePdfPath);
File.Move(tempFileLocation, sourcePdfPath);
}