繁体   English   中英

使用iTextSharp将多个页面添加到pdf表单

[英]Add multiple pages to pdf form with iTextSharp

我正在尝试填写pdf表单,并且该表单可能具有相同表单的多个页面,因此,与其将每个页面都写到磁盘,我想在所有页面的内存中创建一个pdf文档。

我已经看到了很多使用FileStream从现有pdf文件中添加页面的示例,但是对于填写论坛并将其添加到MemoryStream并没有什么真正的帮助。

基本上,我需要用PdfStamper填写论坛,然后将该表单追加到“主” 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视频教程吗? 您可以在这里找到它并且有一个示例可以完全满足您的要求。

如果您不喜欢观看视频,也可以查阅本书的第6章 您也将在其中找到一个示例,该示例说明了如何做。

如果您偏爱“食谱书”样式,请查看StackOverflow上的“最佳iText问题” 它至少有一个涉及PdfStamperMemoryStream组合的PdfStamper

如果您确实阅读了文档,那么您将找到示例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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM