Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用iText将用户输入添加到PDF表单_Java_Android_Pdf Generation_Itext_Acrofields - Fatal编程技术网

Java 使用iText将用户输入添加到PDF表单

Java 使用iText将用户输入添加到PDF表单,java,android,pdf-generation,itext,acrofields,Java,Android,Pdf Generation,Itext,Acrofields,嘿,所以我尝试使用iText获取用户添加的字符串,然后将它们添加到我导入应用程序的可填充PDF中。但是,我的应用程序无法识别我添加的预先描述的字符串。我将只添加一些代码片段,这样任何人都可以告诉我出了什么问题。很抱歉,如果这听起来像一个软弱的问题,但这是我第一次使用iText 这是我的MainActivity.java public class Main extends Activity { EditText editText,editText2,editText3,editText4,edit

嘿,所以我尝试使用iText获取用户添加的字符串,然后将它们添加到我导入应用程序的可填充PDF中。但是,我的应用程序无法识别我添加的预先描述的字符串。我将只添加一些代码片段,这样任何人都可以告诉我出了什么问题。很抱歉,如果这听起来像一个软弱的问题,但这是我第一次使用iText

这是我的MainActivity.java

public class Main extends Activity {
EditText editText,editText2,editText3,editText4,editText5,editText6,editText7,editText8,editText9,editText10;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    final Customer newCustomer=new Customer();
    try {
        reader=new PdfReader(getResources().openRawResource(R.raw.pgform));
    } catch (IOException e) {
        e.printStackTrace();
    }



    findViewsById();

    savebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Customer newCustomer=new Customer();
            //newCustomer.one(editText.getText().toString());
            //newCustomer.two(editText2.getText().toString());
            OutputStream output=null;
            try {
                reader=new PdfReader(getResources().openRawResource(R.raw.pvgform));
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                PdfStamper stamper=new PdfStamper(reader,output);
                AcroFields acroFields=stamper.getAcroFields();
                acroFields.setField("fullnameorinitials",one);
                acroFields.setField("agedob",two);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });



}
private void findViewsById(){ 
    editText=(EditText)findViewById(R.id.editText);
    editText2=(EditText)findViewById(R.id.editText2);
    editText3=(EditText)findViewById(R.id.editText3);
    editText4=(EditText)findViewById(R.id.editText4);
    editText5=(EditText)findViewById(R.id.editText5);
    editText6=(EditText)findViewById(R.id.editText6);
    editText7=(EditText)findViewById(R.id.editText7);
    editText8=(EditText)findViewById(R.id.editText8);
    editText9=(EditText)findViewById(R.id.editText9);
    editText10=(EditText)findViewById(R.id.editText10);
}


public class Customer{
    String one=editText.getText().toString();
    String two=editText2.getText().toString();
    String three=editText3.getText().toString();
    String four=editText4.getText().toString();
    String five=editText5.getText().toString();
    String six=editText6.getText().toString();
    String seven=editText7.getText().toString();
    String eight=editText8.getText().toString();
    String nine=editText9.getText().toString();
    String ten=editText10.getText().toString();

}


}
似乎有问题的代码行是当我尝试在我的应用程序中的每个editText中设置PDF中的字段时

acroFields.setField("fullnameorinitials",one);
错误出现在字符串值(一)上。 请任何形式的生殖帮助是感激的

代码中有两个问题,一个涉及阻止编译的变量作用域,另一个涉及阻止正确结果PDF的iText API使用

可变范围 变量必须声明并在其使用范围内可见。对于基于
视图的匿名内部类中的
onClick
实现中的
one
two
,情况并非如此。OnClickListener
Main.onCreate
中构造:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    [...]
    savebutton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            [...]
            try
            {
                PdfStamper stamper=new PdfStamper(reader,output);
                AcroFields acroFields=stamper.getAcroFields();
                acroFields.setField("fullnameorinitials",one);
                acroFields.setField("agedob",two);
            }
            [...]
        }
    });
}
此代码可以使用所有静态
Main
变量、手头上
Main
实例的所有非静态成员变量、在实例化
OnClickListener
之前在
onCreate
中声明的所有最终变量、匿名类的所有静态变量以及手头上实例的所有非静态变量,在使用
one
two
之前,单击
中的所有变量

唯一的变量
one
two
声明位于另一个内部类
Customer

假设那些
Customer
类成员已经初始化的值是
onClick
中所需的数据,编译失败可以如下修复:

            [...]
            try
            {
                PdfStamper stamper=new PdfStamper(reader,output);
                AcroFields acroFields=stamper.getAcroFields();
                acroFields.setField("fullnameorinitials", editText.getText().toString());
                acroFields.setField("agedob", editText2.getText().toString());
            }
            [...]

(当然,您可以插入
客户
bean以分离关注点,但在这种情况下,请使用独立于视图字段的合理的成员名称,例如
全名
,而不是
一个

现在代码可以编译了,但仍然不一定产生正确的结果。因此:

iText API的使用 在上面的代码中,
PdfStamper
被实例化,然后用它设置一些字段,然后什么都没有。。。另一方面,iText API合同要求
PdfStamper
实例在使用后关闭:在
close
期间,PDF输出最终完成

因此:


此外,iText
PdfStamper
希望写入一些目标,在原始代码中,目标是从使用的
PdfStamper
构造函数的第二个参数初始化的:

                PdfStamper stamper=new PdfStamper(reader,output);

不幸的是,
output
已用iText不喜欢的
null
初始化。因此,请同时提供一个适当的目标
OutputStream

错误在字符串值(一)上-准确地说是哪个错误?此外,您不需要关闭
压模
。因此,即使没有一些错误,您的代码也无法按预期工作。请向我们展示表单!在这种形式下,可能没有名为
fullnameorinitals
的字段(在这种情况下,
one
的值将永远不会被添加)。@mkl它说无法解析方法一,但其中一个是字符串如何将
setField
调用更改为
acroFields.setField(“fullnameorinitals”),editText.getText().toString())
acroFields.setField(“agedob”,editText2.getText().toString())
。然后不要忘记
stamper.close()
(当然可以插入
Customer
bean以分离关注点,但在这种情况下,使用独立于视图字段的合理的成员名称,例如
fullName
,而不是
one
                PdfStamper stamper=new PdfStamper(reader,output);