Я продолжаю получать эту ошибку в каком-то файле PDF. Он отлично работает с некоторыми PDF-файлами, а с другими PDF-файлами выдает ошибку.
Баночка использовалась: формы-7.1.4.jar io-7.1.4.jar макет-7.1.4.jar ядро-7.1.4.jar
package test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.*;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.forms.PdfAcroForm;
public class test5 {
public static final String DATASHEET
= "2.pdf";
public static void main(String[] args) throws Exception {
PdfReader reader = new PdfReader(DATASHEET);
PdfDocument pdfDoc = new PdfDocument(reader);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
Set<String> fields = form.getFormFields().keySet();
for (String key : fields) {
PdfName type = form.getField(key).getFormType();
if (type!= null && 0 == PdfName.Btn.compareTo(type) )
{
String[] states = form.getField(key).getAppearanceStates();
for (int i = 0; i < states.length; i++) {
System.out.println(states[i]);
}
}
}
}
}
Эта программа находит значения переключателей в pdf




Вы открываете PdfDocument только с PdfReader, без PdfWriter:
PdfDocument pdfDoc = new PdfDocument(reader);
Таким образом, вы не можете (глубоко) изменить документ. С другой стороны, вы получаете AcroForm со вторым аргументом true:
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
Это сигнализирует iText, что вы хотите добавить в документ новую структуру AcroForm, если ее еще нет. Это глубокое изменение.
Таким образом, ваш код работает для PDF-файлов, которые уже имеют структуру AcroForm, и не работает для PDF-файлов, в которых ее нет.
Поэтому либо используйте записываемый PdfDocument (с также PdfWriter), либо не говорите iText создавать структуры AcroForm (с параметром false). Для последнего варианта вам, возможно, придется добавить проверку null.