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

Java 如何从AFP文件中提取元数据?,java,afp,Java,Afp,我有一份AFP文件样本。。想从中读取TLE(标记逻辑元素),以获得某些预定义的标记,如账号或账单号,以便我可以将其转换为特定账单号的PDF。还有任何公共Java api用于执行相同的操作 有两种不同类型的TLE:组级别和页面级别。组级TLE显示在BNG(开始命名组)之后,而页面级TLE显示在页面的环境组(BPG)之后。TLE本身使用两个三元组来携带元数据:FullyQualifiedName和AttributeValue。第一个包含键名,另一个包含值 假设您的AFP格式良好,以下代码可帮助您从中

我有一份AFP文件样本。。想从中读取TLE(标记逻辑元素),以获得某些预定义的标记,如账号或账单号,以便我可以将其转换为特定账单号的PDF。还有任何公共Java api用于执行相同的操作

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

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

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();
    }

}

}
import java.io.BufferedInputStream;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.util.Optional;
导入org.afplib.afplib.*;
导入org.afplib.base.*;
导入org.afplib.io.AfpInputStream;
公共类垃圾堆{
公共静态void main(字符串[]args){
try(AfpInputStream in=新的AfpInputStream(
新的BufferedInputStream(新的FileInputStream(args[0])){
int page=0;
int组=0;
布尔pageLevel=false;
SF-SF;
而((sf=in.readStructuredField())!=null){
if(BPG的sf实例){
page++;
pageLevel=true;
}
if(EPG的sf实例){
pageLevel=false;
}
if(BNG的sf实例){
组++;
}
if(TLE的sf实例){
TLE TLE=(TLE)sf;
可选fqn=tle.getTriples().stream()
.filter(FullyQualifiedName.class::isInstance).map(FullyQualifiedName.class::cast)
.findFirst();
可选)。将AFP转换为PDF是一个完全不同的故事,并不是那么容易