【问题标题】:PDFBox - Refreshing nested PDComboBox from JavaPDFBox - 从 Java 刷新嵌套的 PDComboBox
【发布时间】:2020-09-24 13:44:36
【问题描述】:

我是 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

冲突字段:

  • 时间和地点 -> 世界地区 州/地区
  • 飞机信息-> 制造商 型号
  • 航班详情 -> 最后出发点 -> 国家 国际民航组织代码
  • 航班详情 -> 计划目的地 -> 国家 国际民航组织代码

感谢您之前的支持。

【问题讨论】:

  • 请分享文件并告知pdfbox版本。
  • @TilmanHausherr 谢谢,我已经更新了帖子:
  • 在提出问题之前,您应该始终尝试使用最新版本。您的链接要求登录,这不行。请注意,PDFBox 不支持字段之间的关系,这是 javascript。 PDFBox 单独查看每个字段。 (我不确定这是否是您的问题)也没有“嵌套”组合框之类的东西。我怀疑这是视觉上的事情。
  • 您好@TilmanHausherr,谢谢。我尝试使用最新版本,但问题仍然存在。对不起,也许我解释错了,也修复了链接。我认为我必须尝试运行在 PDF 编辑器中选择第一个组合框的选项时发生的触发器的方式,以便刷新第二个组合框的选项列表。
  • 谢谢@TilmanHausherr,它有效!我可以检查这些脚本用来调用组件的名称,在该组件中获取选项和值以加载另一个组合框,我发现它们具有我们可以使用数据库中的数据组合的名称,然后我使用 PDFBox 的方法复制了该逻辑到动态加载几个组合框。 =)

标签: java combobox pdfbox


【解决方案1】:

感谢@TilmanHausherr 的支持。

使用 PDFDebugger,您可以看到 PDF 文件对于“父”组合框的每个选项都有一个内部组合框,您可以在其中使用选项值列表来加载“嵌套”组合框。

  1. 用PDFDebugger打开PDF文件(需要下载PDFBox app的jar):

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

  2. 激活以下选项以显示 PDF 内容并更轻松地检查它们:“查看 -> 显示内部结构”

  3. 在组件树中,转到“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());

【讨论】:

  • 您也可以在页面视图中将鼠标悬停在字段上,名称将出现在状态行中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2019-11-03
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
相关资源
最近更新 更多