【发布时间】: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 的方法复制了该逻辑到动态加载几个组合框。 =)