Itextsharp 使用PdfStamper插入页面不会导入表单字段

Itextsharp 使用PdfStamper插入页面不会导入表单字段,itextsharp,itext,Itextsharp,Itext,我正在将页面插入pdf文档。页面在末尾不会被添加,或者开始它们需要插入到中间的某个地方。我有一种方法来确定带有书签的插入位置。 关键是不要松开书签。所以我使用PdfStamper来插入页面。问题是正在插入的PDF具有表单字段,而这些字段无法通过 执行插入操作的代码 for (int pageNum = 1; pageNum <= readerPdfToAdd.NumberOfPages; pageNum++) { PdfImportedPage page = pdfStamper.

我正在将页面插入pdf文档。页面在末尾不会被添加,或者开始它们需要插入到中间的某个地方。我有一种方法来确定带有书签的插入位置。

关键是不要松开书签。所以我使用PdfStamper来插入页面。问题是正在插入的PDF具有表单字段,而这些字段无法通过

执行插入操作的代码

for (int pageNum = 1; pageNum <= readerPdfToAdd.NumberOfPages; pageNum++)
{
    PdfImportedPage page = pdfStamper.GetImportedPage(readerPdfToAdd, pageNum);
    pdfStamper.InsertPage(filesByCategory[i].PageOfInsert + pageNum, readerPdfToAdd.GetPageSizeWithRotation(pageNum));

    var rotation = readerPdfToAdd.GetPageRotation(pageNum);
    if (rotation == 90 || rotation == 270) 
    {
        pdfStamper.GetUnderContent(filesByCategory[i].PageOfInsert + pageNum)
                  .AddTemplate(page, 0, -1f, 1f, 0, 0, readerPdfToAdd.GetPageSizeWithRotation(pageNum).Height);                                          
    }
    else 
    {
        pdfStamper.GetUnderContent(filesByCategory[i].PageOfInsert + pageNum).AddTemplate(page, 1f, 0, 0, 1f, 0, 0);


    }
}
我尝试了类似的方法来复制字段,但这并不完全复制

foreach (KeyValuePair<string, AcroFields.Item> kvp in pdfFormFields.Fields)
{
    var s = pdfFormFields.GetFieldPositions("Date");

    PdfArray r = kvp.Value.GetWidget(0).GetAsArray(PdfName.RECT);
    var name = kvp.Value.GetWidget(0).GetAsArray(PdfName.NAME);
    Rectangle rr = new Rectangle(r.GetAsNumber(0).FloatValue, r.GetAsNumber(1).FloatValue, r.GetAsNumber(2).FloatValue, r.GetAsNumber(3).FloatValue);
    TextField field = new TextField(pdfStamper.Writer, rr, kvp.Value.GetWidget(0).Get(PdfName.T).ToString());

    if (kvp.Value.GetWidget(0).Get(PdfName.V) != null)
        field.Text = kvp.Value.GetWidget(0).Get(PdfName.V).ToString();
    // add the field here, the second param is the page you want it on
    pdfStamper.AddAnnotation(field.GetTextField(), filesByCategory[i].PageOfInsert + pageNum);

    fields.SetField(kvp.Key, kvp.Value.ToString());
}
有更好的方法吗?我尝试过PdfCopy,它可以在源文档上释放书签

请使用PdfCopy或PdfSmartCopy组合文档。如PDFIImportedPage中所述,仅复制内容流中的内容


您可能需要PdfStamper在原始文档上标记一些额外的内容,这很好,但您需要将其与PdfCopy或PdfSmartCopy结合起来,以组装最终文档。

哦,伙计,您可能会受到伤害。查看有关交互元素的PDF规范部分。希望您正在使用的库有一些不错的底层支持,这样您就可以直接操作PDF对象和页面树。iTextsharp能够复制表单数据,我认为GetImportedPage不会将表单数据带入字段。这是一个错误使用库的情况。你需要将PdfStamper与PdfCopy相结合。谢谢你的帮助。PdfCopy和PdfSmartCopy的问题是书签丢失,书签是我文档中不可或缺的一部分。我在这里看到了你的答案,所以不要把书签带过来。我决定让阅读器通过PdfStamper并展平文件。这样我就可以得到表单数据。对于我的申请,没有表格是可以的。内容才是最重要的。好吧,那是另一种选择。为了完整性起见:可以合并正在合并的不同文档的书签,并将这些书签应用于您的PdfCopy和PdfSmartCopy实例。