首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PDFBox -刷新来自Java的嵌套PDComboBox

PDFBox -刷新来自Java的嵌套PDComboBox
EN

Stack Overflow用户
提问于 2020-09-24 13:44:36
回答 1查看 273关注 0票数 0

我刚开始使用PDFBox,需要一些帮助。

我在网上搜索过,但没有发现任何东西,而且尝试了很多东西。

我必须从PDF文件中解析,才能从Java中填写一些字段,然后再导出,从数据库中获取数据。我有几个嵌套的组合框,当我将值放在第一个框中时,它会显示值的正确文本,但是当我将值放在嵌套组合框中时,它会显示值而不是文本,它不会根据第一个组合框刷新值的列表。

如果从PDF编辑器编辑PDF文件,则不会发生此问题。

代码语言:javascript
运行
复制
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

  • Aircraft
  • When and where -> World and <-> -> information -> )制造商<->型号
  • 航班详细信息->最后起飞点->国家<->国际民航组织代码
  • 航班详细信息计划目的地国家<->国际民航组织代码

谢谢你事先的支持。

EN

回答 1

Stack Overflow用户

发布于 2020-09-28 10:52:38

感谢@TilmanHausherr对您的支持。

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

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

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

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

组件树中的

  1. 转到“根-> AcroForm ->字段”,在这里您可以看到所有组件及其属性、选项、值等

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

代码语言:javascript
运行
复制
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());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64047832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档