我有一个示例AFP文件..想从它读取TLE(标记逻辑元素)以获得某些预定义的标签,如帐户号或帐单号,以便我可以将其转换为PDF特定帐单号 . 还有任何公共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是一个完全不同的故事,并不那么容易 .
1 回答
有两种不同类型的TLE:组级别和页面级别 . 组级别TLE出现在BNG(开始命名组)之后,而页面级别TLE出现在页面的环境组(BPG)之后 . TLE本身使用两个三元组来携带元数据:FullyQualifiedName和AttributeValue . 第一个包含键名,另一个包含值 .
假设您的AFP格式正确,代码可帮助您从TLE中提取元数据:
该代码使用afplib(https://github.com/yan74/afplib) . 将您的AFP转换为PDF是一个完全不同的故事,并不那么容易 .