Использование iText для добавления пользовательского ввода в форму PDF
Привет, я пытаюсь использовать 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();
}
}
Строка кода, которая, кажется, имеет проблемы, - это когда я пытаюсь установить поля в PDF с каждым editText в моем приложении.
acroFields.setField("fullnameorinitials",one);
Ошибка в строковом значении (один). Пожалуйста, оцените любой вид репродуктивной помощи!
1 ответ
В коде есть две проблемы, одна из которых касается переменных областей, препятствующих компиляции, и одна, касающаяся использования 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
все статические переменные анонимного класса и все нестатические переменные экземпляра, и все переменные в 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
вместо 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
,