当前位置: 首页 > 知识库问答 >
问题:

itext AcroFields表单位于第二页,需要保留相同的模板

康烨伟
2023-03-14

我有一个我在MS Word中创建的表单,然后转换为PDF(表单),然后我使用PDF阅读器加载此表单,然后我创建了一个填入字段的压模,如果我想添加第二个相同的页面模板(表单)我如何做到这一点,并用相同的信息填充一些字段

我已经设法用另一个阅读器获得了一个新页面,但是如何在该页面上标记信息,因为AcroFields将具有相同的名称#

我就是这样做到的:

        stamper.insertPage(1,PageSize.A4);
        PdfReader reader = new PdfReader("/soaprintjobs/templates/STOTemplate.pdf"); //reads the original pdf
        PdfImportedPage page; //writes the new pdf to file 
        page = stamper.getImportedPage(reader,1); //retrieve the second page of the original pdf
        PdfContentByte newPageContent = stamper.getUnderContent(1); //get the over content of the first page of the new pdf
        newPageContent.addTemplate(page, 0,0); 

谢谢

共有1个答案

臧俊杰
2023-03-14

Acroform字段具有相同名称的字段被视为相同字段的属性。它们具有相同的价值。因此,如果您在第1页和第2页上有一个同名的字段,它们将始终显示相同的值。如果您在第1页更改值,它也将在第2页更改。

在某些情况下,这是可取的。您可能有一个带有参考号的多页表单,并且希望在每页上重复该参考号。在这种情况下,可以使用同名字段。

但是,如果您希望在一个文档中具有相同表单的多个副本以及不同的数据,则会遇到问题。您必须重命名表单字段,使其唯一。

在iText中,不应使用getImportedPage()复制表单。从iText 5.4.4开始,您可以使用PdfCopy类。在早期版本中,应使用PdfCopyFields类。

下面是一些复制Acroforms和重命名字段的示例代码。iText 5.4.4及以上版本的代码在注释中。

public static void main(String[] args) throws FileNotFoundException, DocumentException, IOException {

    String[] inputs = { "form1.pdf", "form2.pdf" };

    PdfCopyFields pcf = new PdfCopyFields(new FileOutputStream("out.pdf"));

    // iText 5.4.4+
    // Document document = new Document();
    // PdfCopy pcf = new PdfCopy(document, new FileOutputStream("out.pdf"));
    // pcf.setMergeFields();
    // document.open();

    int documentnumber = 0;
    for (String input : inputs) {
        PdfReader reader = new PdfReader(input);
        documentnumber++;
        // add suffix to each field name, in order to make them unique.
        renameFields(reader, documentnumber);
        pcf.addDocument(reader);
    }
    pcf.close();

    // iText 5.4.4+
    // document.close();

}

public static void renameFields(PdfReader reader, int documentnumber) {
    Set<String> keys = new HashSet<String>(reader.getAcroFields()
            .getFields().keySet());
    for (String key : keys) {
        reader.getAcroFields().renameField(key, key + "_" + documentnumber);
    }
}
 类似资料:
  • 在第一章中,我们学习了使用Tornado创建一个Web应用的基础知识。包括处理函数、HTTP方法以及Tornado框架的总体结构。在这章中,我们将学习一些你在创建Web应用时经常会用到的更强大的功能。 和大多数Web框架一样,Tornado的一个重要目标就是帮助你更快地编写程序,尽可能整洁地复用更多的代码。尽管Tornado足够灵活,可以使用几乎所有Python支持的模板语言,Tornado自身也

  • 我正在使用php和javascript进行网络编程,这是我想问的一个一般性问题,通常在页面刷新时,文本区域或输入中的所有内容都会被删除; 是否有办法保留用户输入、键入的字符或复选框?不保存到会话中?还是我真的需要保存它?非常感谢。 (我不是说表单提交导致重新加载,但只是简单地键入文本区域,然后按下刷新按钮。)

  • 我在我的jsp中有一个下拉列表,使用Spring mvc,我面临的问题是,在表单提交时,下拉列表中的值会更改为默认值。 我已经绑定了这个下拉列表,如下所示- BackingObject包含ObjectA的List,ObjectA包含另一个Object ObjectB,ObjectB包含基元类型属性id 我正在使用ajax向控制器发送post请求。

  • 我正在努力避免使用多个JTable重复数据。基本上我有一个TableModel,它有一个数据的arraylist和一个字符串[]头。 到目前为止没有什么新东西。现在我有了另一个TableModel,它具有相同的数据数组列表,但具有不同的字符串[]标头。 我无法使我的代码正常工作。我很想知道如何跨多表模型共享数据的arrayList。 因此,当我更改数据时,所有模型都会更新,不会出现数据重复。我想避

  • 这是我使用插件kotlin数据类的模型: 这是我的回应: 我想在textView中显示品种名称,但运行应用程序时出错:

  • 当我测试一个控制器时,我发现下面的代码可以正常工作。但我不明白为什么模型在映射后返回后包含“PasspProperty”属性。PasspProperty类仅使用验证约束进行注释。在控制器中,它只在方法中使用@Valid annotation进行注释,如下面的代码所示。 我在控制器中有以下映射: 获取: 帖子: 我添加了以下测试和输出。如您所见,返回的ModelAndView包含未添加到@PostM