【问题标题】:Add multiple pages to pdf form with iTextSharp使用 iTextSharp 将多个页面添加到 pdf 表单
【发布时间】:2015-04-02 23:23:11
【问题描述】:

我正在尝试填写一个 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 流,以便它们都在同一个文档中。如何在内存中添加多个页面而不是先将其写入磁盘?

【问题讨论】:

    标签: c# itextsharp memorystream


    【解决方案1】:

    您是否观看了 iText 视频教程?您可以找到它here,并且有一个示例完全按照您的要求进行。

    如果你不喜欢看视频,也可以咨询chapter 6 of my book。您也可以在其中找到一个说明如何操作的示例。

    如果您偏爱“食谱书”风格,请查看The Best iText Questions on StackOverflow。它至少有一个例子涉及PdfStamperMemoryStream 的组合。

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

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多