嘿所以我正在尝试使用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);
错误在字符串值(一)上。 请各种生殖帮助表示赞赏!
答案 0 :(得分:2)
代码中有两个问题,一个涉及阻止编译的变量范围,另一个涉及使用iText API阻止正确结果PDF。
变量必须在使用它们的范围内声明并可见。基于one
中构建的two
的匿名内部类onClick
实现中的View.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
实例的所有非静态成员变量,在onCreate
中声明的所有最终变量在OnClickListener
实例化之前1}},匿名类的所有静态变量和实例中的所有非静态变量,以及使用onClick
和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());
}
[...]
(您当然可以在Customer
bean中分离关注点,但在这种情况下,请使用独立于视图字段的合理成员名称,例如fullName
而不是{{ 1}}。)
现在可以编译代码,但它仍然不一定产生正确的结果。因此:
在上面的代码中,one
被实例化,然后一些字段被设置,然后什么都没有...另一方面,iText API契约期望PdfStamper
实例在关闭之后关闭使用:在PdfStamper
期间,PDF输出已完成。
因此:
close
此外,iText [...]
try
{
PdfStamper stamper=new PdfStamper(reader,output);
AcroFields acroFields=stamper.getAcroFields();
acroFields.setField("fullnameorinitials", editText.getText().toString());
acroFields.setField("agedob", editText2.getText().toString());
stamper.close();
}
[...]
期望一些目标写入,在原始代码中,目标是从使用的PdfStamper
构造函数的第二个参数初始化的:
PdfStamper
不幸的是, PdfStamper stamper=new PdfStamper(reader,output);
已使用output
初始化,iText不会喜欢。因此,请提供适当的目标null
。