PDFBox-从Java刷新嵌套的PDCOMBOX
我刚使用PDFBox,需要一些帮助 我在网上搜索过,但什么也没找到,我尝试过很多东西 我必须从一个PDF文件中进行解析,以便从Java中填写一些字段,并从数据库中获取数据,再次导出已填写的字段。我有几个嵌套的组合框,当我将值放入第一个组合框时,它会显示值的正确文本,但当我将值放入嵌套的组合框时,问题出现了,它会显示值而不是文本,它不会刷新值的列表,这取决于第一个组合框 如果从PDF编辑器编辑PDF文件,则不会发生此问题PDFBox-从Java刷新嵌套的PDCOMBOX,java,combobox,pdfbox,Java,Combobox,Pdfbox,我刚使用PDFBox,需要一些帮助 我在网上搜索过,但什么也没找到,我尝试过很多东西 我必须从一个PDF文件中进行解析,以便从Java中填写一些字段,并从数据库中获取数据,再次导出已填写的字段。我有几个嵌套的组合框,当我将值放入第一个组合框时,它会显示值的正确文本,但当我将值放入嵌套的组合框时,问题出现了,它会显示值而不是文本,它不会刷新值的列表,这取决于第一个组合框 如果从PDF编辑器编辑PDF文件,则不会发生此问题 public ByteArrayOutputStream parseToSm
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;
}
public ByteArrayOutputStream parsetosmart pdf(最终文件文件,最终映射pdfContentMap){
最终由TEARRAYOUTPUTSTREAM BAS完成;
试一试{
final InputStream InputStream=新的BufferedInputStream(新文件InputStream(文件));
final PDDocument pdfDocument=PDDocument.load(inputStream.readAllBytes());
inputStream.close();
最终PDAcroForm pdfAcroForm=pdfDocument.getDocumentCatalog().getAcroForm();
if(Objects.isNull(pdfAcroForm)){
抛出新的FileEmptyException();
}
for(最终映射.条目:新树映射(pdfContentMap).entrySet()){
最后一个字符串key=entry.getKey();
最终字符串值=entry.getValue();
最终PDField=pdfAcroForm.getField(键);
如果(“Tx”.equals(field.getFieldType())){
字段。设置值(值);
}else如果(“Ch”.equals(field.getFieldType())){
if(PDCOMBOX的字段实例){
最终PDCOMBOX PDCOMBOX=(PDCOMBOX)字段;
PDCOMBOX.setValue(值);
}
}
}
bas=新的ByteArrayOutputStream();
pdfDocument.save(baos);
pdfDocument.close();
}捕获(最终IOE例外){
抛出新的FileProcessingException();
}
返回宝;
}
编辑:
PDFBox版本:2.0.0(我也尝试了最新版本:2.0.21)
指向我用来测试的PDF文件的链接。
冲突字段:
- 时间和地点->世界区域州/地区
- 飞机信息-> 制造商模型
- 航班详情->最后出发点-> 国际民航组织国家代码
- 航班详情->计划目的地-> 国际民航组织国家代码
感谢您的支持。感谢@tilmahausherr对您的支持 使用PDFDebugger,您可以看到PDF文件的“父”组合框的每个选项都有一个内部组合框,您可以在其中获取选项值列表以加载“嵌套”组合框
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());
请共享该文件并告诉pdfbox版本。@Tilmahauser谢谢,我已经更新了帖子:你应该在提问之前尝试使用最新版本。您的链接请求登录,这不正常。请注意,PDFBox不支持字段之间的关系,这是javascript。PDFBox单独查看每个字段。(我不确定这是否是你的问题)也没有“嵌套”组合框这样的东西。我怀疑这是视觉上的东西。再次你好@TilmanHausherr,谢谢。我尝试使用最新版本,但问题仍然存在。对不起,也许我解释错了,也修复了链接。我想我必须尝试在PDF编辑器中选择第一个组合框的选项时运行触发器,以便刷新第二个组合框的选项列表。谢谢,@TilmanHausherr,它可以工作!我可以检查这些脚本用来调用组件的名称,其中获取选项和值以加载另一个组合框,我发现它们的名称可以与数据库中的数据组合,然后我使用PDFBox方法复制该逻辑以手动加载多个组合框。=)您也可以在页面视图中将鼠标悬停在字段上,名称将显示在状态行中。