首页 文章

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

提问于
浏览
0

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

1 回答

  • 1

    有两种不同类型的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是一个完全不同的故事,并不那么容易 .

相关问题