Использование 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,

Другие вопросы по тегам