Я пытался извлечь XFA из файла, и у меня все работало нормально, пока я не обновил PDFBox с 1.8.12 до 2.0.4.
У меня есть файл, который я могу извлечь XFA, используя 1.8.12, но не используя 2.0.4.
Когда я извлекаю это с помощью PDFBox с использованием 2.0.4, я получаю структуру XFA, но почти все значения отсутствуют. С другой стороны, когда я пытаюсь извлечь ту же форму, используя 1.8.12, все получается нормально.
Я рассмотрел аналогичную проблему на ТАК. Говорят, что это исправлено в 2.0.4, но я все еще сталкиваюсь с проблемами.
Любые идеи?
Я включил файлы
РЕДАКТИРОВАТЬ №1
Для версии 2.0.4
// returns PDXFA
public static byte[] getParsableXFAForm(File file) {
if (file == null)
return null;
PDDocument doc;
PDDocumentCatalog catalog;
PDAcroForm acroForm;
PDXFAResource xfa;
try {
// String pass = null;
doc = PDDocument.load(file);
if (doc == null)
return null;
// flattenPDF(doc);
doc.setAllSecurityToBeRemoved(true);
// System.out.println("Security " + doc.isAllSecurityToBeRemoved());
catalog = doc.getDocumentCatalog();
if (catalog == null) {
doc.close();
return null;
}
acroForm = catalog.getAcroForm();
if (acroForm == null) {
doc.close();
return null;
}
xfa = acroForm.getXFA();
if (xfa == null) {
doc.close();
return null;
}
// TODO return byte[]
byte[] xfaBytes = xfa.getBytes();
doc.close();
return xfaBytes;
} catch (IOException e) {
// handle IOException
// happens when the file is corrupt.
e.printStackTrace();
System.out.println("XFAUtils-getParsableXFAForm-IOException");
return null;
}
}
Для версии 1.8.12
public static byte[] getParsableXFAForm(File file) {
if (file == null)
return null;
PDDocument doc;
PDDocumentCatalog catalog;
PDAcroForm acroForm;
PDXFA xfa;
try {
doc = PDDocument.loadNonSeq(file, null);
if (doc == null)
return null;
// flattenPDF(doc);
doc.setAllSecurityToBeRemoved(true);
// System.out.println("Security " + doc.isAllSecurityToBeRemoved());
catalog = doc.getDocumentCatalog();
if (catalog == null) {
doc.close();
return null;
}
acroForm = catalog.getAcroForm();
if (acroForm == null) {
doc.close();
return null;
}
xfa = acroForm.getXFA();
if (xfa == null) {
doc.close();
return null;
}
// TODO return byte[]
byte[] xfaBytes = xfa.getBytes();
doc.close();
return xfaBytes;
} catch (IOException e) {
// handle IOException
// happens when the file is corrupt.
// e.printStackTrace();
System.out.println("XFAUtils-getParsableXFAForm-IOException");
return null;
}
}