iTextSharp添加现有页面的新实例 [英] iTextSharp adding new instances of an existing page

查看:111
本文介绍了iTextSharp添加现有页面的新实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个三页PDF,其中三个都有AcroFields。我需要能够生成一个新的PDF,第2页重复N次。第2页的每个新实例都需要修改字段名称,以使它们与第2页的其他实例不同。在此之前解决此问题的人是否可以提供语法示例?

Let's say I have a three page PDF and all three of them have AcroFields. I need to be able to generate a new PDF with page 2 repeated N number of times. Each new instance of page 2 will need to have the field names modified to make them distinct from the other instances of page 2. Can someone who's solved this problem before provide a syntax example?

推荐答案

这样可以生成一个大文件。我想这是因为第2页上的图像重复多次而不是重复使用。

This works but generates a large file. I guess it is because the image on page 2 is duplicated many times instead of being reused.

public static void ExpandRepeatingPages(string sourcePdfPath, string outputPdfPath)
{
    /* figure out how many pages we are working with */
    var transientPdfReader = new PdfReader(sourcePdfPath);
    var numberOfPages = transientPdfReader.NumberOfPages;
    transientPdfReader.Close();

    var outputFileStream = new FileStream(outputPdfPath, FileMode.Create);
    var pdfCopyFields = new PdfCopyFields(outputFileStream);

    foreach (var pageNumber in Enumerable.Range(1, numberOfPages))
    {
        var pdfBytes = ExtractPageToBytes(sourcePdfPath, pageNumber);
        var pdfReader = new PdfReader(pdfBytes);
        pdfCopyFields.AddDocument(pdfReader);
        pdfReader.Close();

        if (pageNumber == 2)
        {
            foreach (var extraPageNumber in Enumerable.Range(2, 200))
            {
                var extraPagePdfBytes = RenamePageFields(pdfBytes, extraPageNumber);
                pdfReader = new PdfReader(extraPagePdfBytes);
                pdfCopyFields.AddDocument(pdfReader);
                pdfReader.Close();
            }
        }
    }

    pdfCopyFields.Close();
}

public static byte[] ExtractPageToBytes(string sourcePdfPath, int pageNumber)
{
    using (var memoryStream = new MemoryStream())
    {
        var pageNumbers = new System.Collections.ArrayList { pageNumber };
        var pdfReader = new PdfReader(sourcePdfPath);
        var pdfCopyFields = new PdfCopyFields(memoryStream);

        pdfReader.SelectPages(pageNumbers);
        pdfCopyFields.AddDocument(pdfReader);
        pdfReader.RemoveUnusedObjects();
        pdfCopyFields.Close();
        pdfReader.Close();
        return memoryStream.ToArray();
    }
}

private static byte[] RenamePageFields(byte[] pdfBytes, int pageNumber)
{
    using (var memoryStream = new MemoryStream())
    {
        var pdfReader = new PdfReader(pdfBytes);
        var pdfStamper = new PdfStamper(pdfReader, memoryStream);
        var acroFields = pdfStamper.AcroFields;
        var fieldNames = acroFields.Fields.Keys.Cast<String>().ToList();

        foreach (var fieldName in fieldNames)
        {
            var newName = String.Format("{0}_{1}", fieldName, pageNumber);
            acroFields.RenameField(fieldName, newName);
        }

        pdfStamper.Close();
        pdfReader.Close();
        return memoryStream.ToArray();
    }
}

这篇关于iTextSharp添加现有页面的新实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆