创建后无法打开pdf

Unable to open pdf after creation

我正在编写一个程序,它采用带有一堆空白表单字段的模板 PDF,复制它,填写表单,然后展平字段。

其中一个模板有大量字段,因此编写一个填充所有字段的方法会导致错误,指出由于方法的大小限制,代码太大。

为了解决这个问题,我关闭了目标文件,然后尝试用另一种方法打开它,这样我就可以继续填写字段,但这会导致出现错误“(请求的操作无法执行打开了用户映射部分的文件)"

我通过关闭 PDF 结束了第一种方法,所以我不确定问题出在哪里。该程序将执行第一个方法,填充字段但在到达第二个方法时抛出错误。下面的示例代码。

public void E2fill(String srcE2, String destE2) throws IOException
{
    try
    {
        PdfDocument pdf2 = new PdfDocument(new PdfReader(destE2), new PdfWriter(dest2E2));
        PdfAcroForm form2 = PdfAcroForm.getAcroForm(pdf2, true);
        Map<String, PdfFormField> fields2 = form2.getFormFields();
        PdfFormField field2;
        fields2.get("fieldname1").setValue(stringname1);
        //lots more field fills
        pdf2.close()
    }
    catch(Exception x)
    {
        System.out.println(x.getMessage());
    }
}

public void E2fill2(String destE2, String dest2E2) throws IOException
{
    try
    {
        PdfDocument pdf2 = new PdfDocument(new PdfReader(destE2), new PdfWriter(dest2E2));
        PdfAcroForm form2 = PdfAcroForm.getAcroForm(pdf2, true);
        Map<String, PdfFormField> fields2 = form2.getFormFields();
        PdfFormField field2;
        fields2.get("fieldname546").setValue(stringname546);
        //more field fills
        form2.flattenFields();
        pdf2.close();
    }
    catch(Exception x)
    {
        System.out.println(x.getMessage());
    }
}

我建议你试试这个:

    public void fill(String srcE2, String destE2) {
        PdfDocument pdf2 = new PdfDocument(new PdfReader(destE2), new PdfWriter(dest2E2));
        PdfAcroForm form2 = PdfAcroForm.getAcroForm(pdf2, true);
        Map<String, PdfFormField> fields2 = form2.getFormFields();
        E2fill(fields2);
        E2fill2(fields2);
        form2.flattenFields();
        pdf2.close();
    }

    public void E2fill(Map<String, PdfFormField> fields2) throws IOException 
    {
        fields2.get("fieldname1").setValue(stringname1);
        //lots more field fills
    }

    public void E2fill2(PdfAcroForm form2) throws IOException {
        fields2.get("fieldname546").setValue(stringname546);
        //more field fills
    }