Java 使用iText将用户输入添加到PDF表单
嘿,所以我尝试使用iText获取用户添加的字符串,然后将它们添加到我导入应用程序的可填充PDF中。但是,我的应用程序无法识别我添加的预先描述的字符串。我将只添加一些代码片段,这样任何人都可以告诉我出了什么问题。很抱歉,如果这听起来像一个软弱的问题,但这是我第一次使用iText 这是我的MainActivity.javaJava 使用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
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输出最终完成
因此:
此外,iTextPdfStamper
希望写入一些目标,在原始代码中,目标是从使用的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);