PDFBox-从Java刷新嵌套的PDCOMBOX

PDFBox-从Java刷新嵌套的PDCOMBOX,java,combobox,pdfbox,Java,Combobox,Pdfbox,我刚使用PDFBox,需要一些帮助 我在网上搜索过,但什么也没找到,我尝试过很多东西 我必须从一个PDF文件中进行解析,以便从Java中填写一些字段,并从数据库中获取数据,再次导出已填写的字段。我有几个嵌套的组合框,当我将值放入第一个组合框时,它会显示值的正确文本,但当我将值放入嵌套的组合框时,问题出现了,它会显示值而不是文本,它不会刷新值的列表,这取决于第一个组合框 如果从PDF编辑器编辑PDF文件,则不会发生此问题 public ByteArrayOutputStream parseToSm

我刚使用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;
}
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文件的“父”组合框的每个选项都有一个内部组合框,您可以在其中获取选项值列表以加载“嵌套”组合框

  • 使用PDFDebugger打开PDF文件(您需要下载PDFBox应用程序的jar):

    java-jar pdfbox-app-x.x.x.jar PDFDebugger

  • 激活以下选项以显示PDF内容并更轻松地进行检查:“查看->显示内部结构”

  • 在组件树中,转到“Root->AcroForm->Fields”,在这里可以看到所有组件及其属性、选项、值等

  • 当您知道各自的名称时,可以使用以下代码加载“嵌套”组合框:

    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方法复制该逻辑以手动加载多个组合框。=)您也可以在页面视图中将鼠标悬停在字段上,名称将显示在状态行中。