提取未在NAMES中列出的嵌入文件

时间:2013-11-15 09:08:57

标签: java pdfbox

我正在尝试从位于此处的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文件的字节在哪里?我该如何访问它们?

2 个答案:

答案 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示例。它描述了如何提取所有类型的嵌入文件。