iTextSharp添加现有页面的新实例

滕皮

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

滕皮

这可以工作,但是会生成一个大文件。我猜这是因为第2页上的图像被重复了很多次,而不是被重复使用。

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();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据条件将Visualforce页面添加到现有页面的末尾?

来自分类Dev

使用C#代码使用iTextSharp将页面书签添加到现有PDF

来自分类Dev

使用C#代码使用iTextSharp将页面书签添加到现有PDF

来自分类Dev

GCE:为现有 VM 实例启用 CDN/将现有 VM 实例添加到新的区域实例组

来自分类Dev

查找所有重定向到现有/实例化的维基百科页面的页面

来自分类Dev

从现有实例创建新实例

来自分类Dev

从现有实例创建新实例,新类实例更改现有类参数

来自分类Dev

为什么将 EF 添加到具有新 Razor 页面的项目中

来自分类Dev

如何创建现有类的新实例?

来自分类Dev

itextsharp将图像添加到现有的pdf

来自分类Dev

asp.net在登录时创建页面的新实例

来自分类Dev

将新内容添加到JSP页面,而不会丢失现有动态生成的内容

来自分类Dev

无限滚动会清除现有数据,然后再向页面添加新数据

来自分类Dev

Unity中的C#脚本打开VS15的新实例,而不是添加到现有实例中

来自分类Dev

Unity中的C#脚本打开VS15的新实例,而不是添加到现有实例中

来自分类Dev

获取angularjs中现有页面的标题

来自分类Dev

使用php保存现有远程页面的副本

来自分类Dev

基于现有实例创建类的新实例

来自分类Dev

ItextSharp MVC5 C# - 现有 pdf 前面的文本

来自分类Dev

向现有对象添加新的关联

来自分类Dev

向现有文件添加新属性

来自分类Dev

iTextSharp创建空白页面的PDF

来自分类Dev

带有自定义页面的新Relic插件

来自分类Dev

如何使用AutoMapper的新API映射到现有实例?

来自分类Dev

提取数据作为现有类的新实例

来自分类Dev

来自现有对象的新 ES6 类实例

来自分类Dev

如何添加为现有行添加新行的列

来自分类Dev

强制使用iTextSharp在文本中插入新的行,并将其插入现有的pdf中

来自分类Dev

强制使用iTextSharp在文本中插入新的行,并将其插入现有的pdf中

Related 相关文章

  1. 1

    如何根据条件将Visualforce页面添加到现有页面的末尾?

  2. 2

    使用C#代码使用iTextSharp将页面书签添加到现有PDF

  3. 3

    使用C#代码使用iTextSharp将页面书签添加到现有PDF

  4. 4

    GCE:为现有 VM 实例启用 CDN/将现有 VM 实例添加到新的区域实例组

  5. 5

    查找所有重定向到现有/实例化的维基百科页面的页面

  6. 6

    从现有实例创建新实例

  7. 7

    从现有实例创建新实例,新类实例更改现有类参数

  8. 8

    为什么将 EF 添加到具有新 Razor 页面的项目中

  9. 9

    如何创建现有类的新实例?

  10. 10

    itextsharp将图像添加到现有的pdf

  11. 11

    asp.net在登录时创建页面的新实例

  12. 12

    将新内容添加到JSP页面,而不会丢失现有动态生成的内容

  13. 13

    无限滚动会清除现有数据,然后再向页面添加新数据

  14. 14

    Unity中的C#脚本打开VS15的新实例,而不是添加到现有实例中

  15. 15

    Unity中的C#脚本打开VS15的新实例,而不是添加到现有实例中

  16. 16

    获取angularjs中现有页面的标题

  17. 17

    使用php保存现有远程页面的副本

  18. 18

    基于现有实例创建类的新实例

  19. 19

    ItextSharp MVC5 C# - 现有 pdf 前面的文本

  20. 20

    向现有对象添加新的关联

  21. 21

    向现有文件添加新属性

  22. 22

    iTextSharp创建空白页面的PDF

  23. 23

    带有自定义页面的新Relic插件

  24. 24

    如何使用AutoMapper的新API映射到现有实例?

  25. 25

    提取数据作为现有类的新实例

  26. 26

    来自现有对象的新 ES6 类实例

  27. 27

    如何添加为现有行添加新行的列

  28. 28

    强制使用iTextSharp在文本中插入新的行,并将其插入现有的pdf中

  29. 29

    强制使用iTextSharp在文本中插入新的行,并将其插入现有的pdf中

热门标签

归档