我刚开始使用PDFBox,需要一些帮助。
我在网上搜索过,但没有发现任何东西,而且尝试了很多东西。
我必须从PDF文件中解析,才能从Java中填写一些字段,然后再导出,从数据库中获取数据。我有几个嵌套的组合框,当我将值放在第一个框中时,它会显示值的正确文本,但是当我将值放在嵌套组合框中时,它会显示值而不是文本,它不会根据第一个组合框刷新值的列表。
如果从PDF编辑器编辑PDF文件,则不会发生此问题。
public ByteArrayOutputStream parseToSmartPdf(final File file, final Map<String, String> pdfContentMap) {
final ByteArrayOutputStream baos;
try {
final InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
final PDDocument pdfDocument = PDDocument.load(inputStream.readAllBytes());
inputStream.close();
final PDAcroForm pdfAcroForm = pdfDocument.getDocumentCatalog().getAcroForm();
if (Objects.isNull(pdfAcroForm)) {
throw new FileEmptyException();
}
for (final Map.Entry<String, String> entry : new TreeMap<>(pdfContentMap).entrySet()) {
final String key = entry.getKey();
final String value = entry.getValue();
final PDField field = pdfAcroForm.getField(key);
if ("Tx".equals(field.getFieldType())) {
field.setValue(value);
} else if ("Ch".equals(field.getFieldType())) {
if (field instanceof PDComboBox) {
final PDComboBox pdComboBox = (PDComboBox) field;
pdComboBox.setValue(value);
}
}
}
baos = new ByteArrayOutputStream();
pdfDocument.save(baos);
pdfDocument.close();
} catch (final IOException e) {
throw new FileProcessingException();
}
return baos;
}编辑:
PDFBox版本: 2.0.0 (我也尝试了最新版本: 2.0.21)
指向用于测试的PDF文件的链接。https://drive.google.com/file/d/1vKslaheP7ADlCca75X1jjd2f8Cca7AzU/view?usp=sharing
相互冲突的字段:
国际民航组织( State/area
谢谢你事先的支持。
发布于 2020-09-28 10:52:38
感谢@TilmanHausherr对您的支持。
使用PDFDebugger,您可以看到PDF文件对于“父”组合框的每个选项都有一个内部组合框,您可以使用选项值列表来加载“嵌套”组合框。
java -jar pdfbox-app-x.jar PDFDebugger PDFDebugger
组件树中的
。
当您知道各自的名称时,可以使用以下代码加载“嵌套”组合框:
final PDField optionsValuesField = pdComboBox.getAcroForm().getField("optionsValuesFieldName");
final PDComboBox optionsValuesPdComboBox = (PDComboBox) optionsValuesField;
final PDField nestedPdComboBoxField = pdComboBox.getAcroForm().getField("nestedPdComboBoxName");
final PDComboBox nestedPdComboBox = (PDComboBox) nestedPdComboBoxField;
nestedPdComboBox.setOptions(optionsValuesPdComboBox.getOptionsExportValues(), optionsValuesPdComboBox.getOptionsDisplayValues());https://stackoverflow.com/questions/64047832
复制相似问题