【问题标题】:iTextSharp adding new instances of an existing pageiTextSharp 添加现有页面的新实例
【发布时间】:2014-05-18 21:17:45
【问题描述】:

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

【问题讨论】:

    标签: c# pdf pdf-generation itextsharp itext


    【解决方案1】:

    这在MergeForms2 示例中进行了说明。您应该将文档分成 3 个文档,每个文档有一页。使用renameFields() 方法创建第二页的变体。

    连接表单是这样完成的:

    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(dest));
    copy.setMergeFields();
    document.open();
    List<PdfReader> readers = new ArrayList<PdfReader>();
    for (int i = 0; i < 3; ) {
        PdfReader reader = new PdfReader(renameFields(src, ++i));
        readers.add(reader);
        copy.addDocument(reader);
    }
    document.close();
    for (PdfReader reader : readers) {
        reader.close();
    }
    

    一个常见的错误是忘记setMergeFields() 方法。

    【讨论】:

    • 这里的问题是,由于 AGPL 版本的许可限制,我不得不使用 iTextSharp 4.1.6.0。我不想通过包含该警告来阻止任何人回答,因为我确信几乎没有人再使用该版本了。旧版本似乎带有catch-22。我可以有 200 个第 2 页的实例,这使得 PdfSmartCopy 几乎是必需品,但由于我正在处理 acro-fields,文档让我相信我必须使用 PdfCopyFields。
    • “由于 AGPL 的许可限制”表明缺乏经济学人才。使用旧软件的成本可能高于商业许可的成本。
    • 成本不是真正的问题,这是我没有时间处理的冗长的内部购买过程。明天需要交付解决方案。当前版本是否有任何新功能可以绕过 PdfCopyFields 与 PdfSmartCopy catch-22?
    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多