Как извлечь метаданные из файла AFP?
У меня есть образец AFP-файла. Я хочу прочитать TLE(Tag Logical Element) из него, чтобы получить определенные предопределенные теги, такие как номер счета или номер счета, чтобы я мог преобразовать его в PDF для конкретного номера счета. Также есть ли публичный Java API для выполнения того же действия.
1 ответ
Существует два различных типа TLE: уровень группы и уровень страницы. TLE уровня группы появляются сразу после BNG (Begin Named Group), а 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 - это совсем другая история, и это не так просто.