gpt4 book ai didi

java - 如何从 AFP 文件中提取元数据?

转载 作者:行者123 更新时间:2023-12-02 02:57:08 24 4
gpt4 key购买 nike

我有一个示例 AFP 文件..想从中读取 TLE(标签逻辑元素)以获取某些预定义标签,例如帐号或帐单号,以便我可以将其转换为特定帐单号的 PDF。还有是否有任何公共(public) Java api 可以执行相同的操作。

最佳答案

TLE 有两种不同类型:组级别和页面级别。组级 TLE 出现在 BNG(开始命名组)之后,而页面级 TLE 出现在页面的环境组 (BPG) 之后。 TLE 本身使用两个三元组来承载元数据:FullyQualifiedName 和 AttributeValue。第一个包含键名称,另一个包含值。

假设您的 AFP 格式良好,以下代码可帮助您从 TLE 中提取元数据:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Optional;

import org.afplib.afplib.*;
import org.afplib.base.*;
import org.afplib.io.AfpInputStream;

public class DumpTLE {

public static void main(String[] args) {
try (AfpInputStream in = new AfpInputStream(
new BufferedInputStream(new FileInputStream(args[0])))) {

int page = 0;
int group = 0;
boolean pageLevel = false;
SF sf;
while((sf = in.readStructuredField()) != null) {

if(sf instanceof BPG) {
page++;
pageLevel = true;
}
if(sf instanceof EPG) {
pageLevel = false;
}
if(sf instanceof BNG) {
group++;
}

if(sf instanceof TLE) {
TLE tle = (TLE) sf;

Optional<FullyQualifiedName> fqn = tle.getTriplets().stream()
.filter(FullyQualifiedName.class::isInstance).map(FullyQualifiedName.class::cast)
.findFirst();
Optional<AttributeValue> value = tle.getTriplets().stream()
.filter(AttributeValue.class::isInstance).map(AttributeValue.class::cast)
.findFirst();

if(fqn.isPresent() && value.isPresent()) {
if(pageLevel) {
System.out.println("page "+page+" - "+fqn.get().getFQName()+":"+value.get().getAttVal());
} else {
System.out.println("group "+group+" - "+fqn.get().getFQName()+":"+value.get().getAttVal());
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}

}

}

代码使用 afplib ( https://github.com/yan74/afplib )。将 AFP 转换为 PDF 是一个完全不同的故事,而且没那么容易。

关于java - 如何从 AFP 文件中提取元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42901792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com