gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:22:09 27 4
gpt4 key购买 nike

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

错误出现在字符串值(一)上。请提供任何形式的生殖帮助!

最佳答案

代码中存在两个问题,一个涉及变量范围阻止编译,另一个涉及 iText API 使用阻止正确的结果 PDF。

变量范围

变量必须在使用它们的范围内声明并可见。 one 的情况并非如此。和twoonClick基于 View.OnClickListener 的匿名内部类中的实现 build 于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 实例化之前,匿名类的所有静态变量和手头实例的所有非静态变量,以及 onClick 中的所有变量使用前onetwo .

唯一的变量onetwo声明位于另一个内部类中,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 来分离关注点,但在这种情况下,请使用独立于 View 字段的合理的成员名称,例如 fullName 而不是 one 。)

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

iText API 使用

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

因此:

            [...]
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();
}
[...]
<小时/>

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

                PdfStamper stamper=new PdfStamper(reader,output);

不幸的是,output已初始化为 null iText 不会喜欢。因此,还请提供一个适当的目标 OutputStream .

关于java - 使用 iText 将用户输入添加到 PDF 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com