我正在尝试从位于此处的a PDF中提取嵌入文件:
Catalog / AF[0] / EF / F
AF
是一个数组EF
是一个词典F
应该是嵌入式文件流使用PDFBox我可以做到这一点:
PDFParser parser = new PDFParser(is);
parser.parse();
PDDocument document = parser.getPDDocument();
PDDocumentCatalog catalog = document.getDocumentCatalog();
PDDocumentNameDictionary namesDictionary = new PDDocumentNameDictionary(catalog);
PDEmbeddedFilesNameTreeNode embeddedFiles = namesDictionary.getEmbeddedFiles();
List<PDNameTreeNode> kids = embeddedFiles.getKids();
PDEmbeddedFilesNameTreeNode node = (PDEmbeddedFilesNameTreeNode) kids.get(0);
COSDictionary cosDictionary = node.getCOSDictionary();
COSArray a = (COSArray) cosDictionary.getDictionaryObject(COSName.NAMES);
COSDictionary d = (COSDictionary) a.getObject(1);
COSDictionary ef = (COSDictionary) d.getDictionaryObject(COSName.EF);
COSDictionary f = (COSDictionary) ef.getDictionaryObject(COSName.F);
System.out.println(f);
输出(格式化以提高可读性):
COSDictionary{(COSName{Length}:COSInt{1433})
(COSName{Filter}:COSName{FlateDecode})
(COSName{Type}:COSName{EmbeddedFile})
(COSName{Subtype}:COSName{text/xml})
(COSName{Params}:COSDictionary{
(COSName{Size}:COSInt{12030})
(COSName{ModDate}:COSString{D:20130628111510+02'00'})
}
)
}
这就是我期待的目标。但是这个嵌入式XML文件的字节在哪里?我该如何访问它们?
答案 0 :(得分:1)
我找到了一种更简单的方法。由于嵌入式文件位于KIDS
下,而不是NAMES
,这是正确的,这有效:
List<PDNameTreeNode> kids = embeddedFiles.getKids();
if (kids != null) {
for (PDNameTreeNode kid : embeddedFiles.getKids()) {
PDComplexFileSpecification spec =
(PDComplexFileSpecification) kid.getValue(ZUGFERD_XML_FILENAME);
PDEmbeddedFile file = spec.getEmbeddedFile();
return file.getByteArray();
}
}
答案 1 :(得分:0)
也许您应该查看PDFBox提供的ExtractEmbeddedFiles示例。它描述了如何提取所有类型的嵌入文件。