您是否观看了 iText 视频教程?您可以找到它here,并且有一个示例完全按照您的要求进行。
如果你不喜欢看视频,也可以咨询chapter 6 of my book。您也可以在其中找到一个说明如何操作的示例。
如果您偏爱“食谱书”风格,请查看The Best iText Questions on StackOverflow。它至少有一个例子涉及PdfStamper 和MemoryStream 的组合。
如果您确实阅读了文档,您会找到示例 DataSheets2:
// step 1
using (Document document = new Document()) {
// step 2
using (PdfSmartCopy copy = new PdfSmartCopy(document, ms)) {
// step 3
document.Open();
// step 4
AddDataSheets(copy);
}
}
您可以在DataSheets1 中找到第 4 步的内容,以了解第 4 步的内容:
public void AddDataSheets(PdfCopy copy) {
IEnumerable<Movie> movies = PojoFactory.GetMovies();
// Loop over all the movies and fill out the data sheet
foreach (Movie movie in movies) {
PdfReader reader = new PdfReader(DATASHEET_PATH);
using (var ms = new MemoryStream()) {
using (PdfStamper stamper = new PdfStamper(reader, ms)) {
Fill(stamper.AcroFields, movie);
stamper.FormFlattening = true;
}
reader = new PdfReader(ms.ToArray());
copy.AddPage(copy.GetImportedPage(reader, 1));
}
}
如您所见,DATASHEET_PATH 是我们将反复重用的表单的路径。我们使用PdfStamper 在内存中填写表格。我们以ms.ToArray() 作为参数创建一个新的PdfReader 实例。
在这种情况下,我们只将第 1 页添加到新 PDF。如果页面较多,则需要循环遍历不同的页面。
您可能希望将DataSheets1 生成的结果与DataSheets2 生成的结果进行比较。你会注意到DataSheets1 是一个不如何做的例子。
您已经知道FillDataSheet() 方法是关于什么的。如果没有,请查看FillDataSheet 示例:
public static void Fill(AcroFields form, Movie movie) {
form.SetField("title", movie.MovieTitle);
form.SetField("director", GetDirectors(movie));
form.SetField("year", movie.Year.ToString());
form.SetField("duration", movie.Duration.ToString());
form.SetField("category", movie.entry.category.Keyword);
foreach (Screening screening in movie.entry.Screenings) {
form.SetField(screening.Location.Replace('.', '_'), "Yes");
}
}