使用 iTextSharp 将多个页面添加到 pdf 表单
Add multiple pages to pdf form with iTextSharp
我正在尝试填写一个 pdf 表单,该表单可能有多个相同表单的页面,因此我不想将每个页面都写入磁盘,而是想在内存中创建一个包含所有页面的 pdf 文档。
我看过很多关于使用 FileStream
从现有 pdf 文件添加页面的示例,但没有真正用于填写论坛并将其添加到 MemoryStream
。
基本上我需要用 PdfStamper
填写论坛,然后将该表格附加到 "master" MemoryStream
因为我不想将它写入文件。
这基本上就是我目前所拥有的
List<Person> people = arson.getPeople();
MemoryStream main = new MemoryStream();
foreach (Person person in people )
{
PdfReader reader = new PdfReader(pathToPdf);
MemoryStream mem = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, mem);
//fill in forum with data from person then append
}
填写表格不是问题,它只是将新页面附加到 main
流,以便它们都在同一个文档中。如何在内存中添加多个页面而不是先将其写入磁盘?
你看iText视频教程了吗?您可以找到它 here,并且有一个示例 完全 您所要求的。
不喜欢看视频的也可以咨询chapter 6 of my book。您也可以在其中找到一个示例来说明该怎么做。
如果您偏爱"recipe book"风格,请看一看The Best iText Questions on Whosebug。它至少有一个示例涉及 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");
}
}
我正在尝试填写一个 pdf 表单,该表单可能有多个相同表单的页面,因此我不想将每个页面都写入磁盘,而是想在内存中创建一个包含所有页面的 pdf 文档。
我看过很多关于使用 FileStream
从现有 pdf 文件添加页面的示例,但没有真正用于填写论坛并将其添加到 MemoryStream
。
基本上我需要用 PdfStamper
填写论坛,然后将该表格附加到 "master" MemoryStream
因为我不想将它写入文件。
这基本上就是我目前所拥有的
List<Person> people = arson.getPeople();
MemoryStream main = new MemoryStream();
foreach (Person person in people )
{
PdfReader reader = new PdfReader(pathToPdf);
MemoryStream mem = new MemoryStream();
PdfStamper stamper = new PdfStamper(reader, mem);
//fill in forum with data from person then append
}
填写表格不是问题,它只是将新页面附加到 main
流,以便它们都在同一个文档中。如何在内存中添加多个页面而不是先将其写入磁盘?
你看iText视频教程了吗?您可以找到它 here,并且有一个示例 完全 您所要求的。
不喜欢看视频的也可以咨询chapter 6 of my book。您也可以在其中找到一个示例来说明该怎么做。
如果您偏爱"recipe book"风格,请看一看The Best iText Questions on Whosebug。它至少有一个示例涉及 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");
}
}