Java 使用PDFBox解析器从PDF中提取嵌入式flash文件的最佳方法是什么?

Java 使用PDFBox解析器从PDF中提取嵌入式flash文件的最佳方法是什么?,java,eclipse,parsing,pdf,pdfbox,Java,Eclipse,Parsing,Pdf,Pdfbox,从上周末开始,我就一直在研究PDF解析。我找到了ApachePDFBOxLibraryforJava,并且已经提取了我正在开发的项目所需的由页面、URL、图像和PDF元数据分隔的文本。现在我缺少一种从PDF中提取嵌入式flash视频的方法 我目前正在分析这个解析器是如何使用可用的pdf文件从pdf中提取富媒体的。此文件包含我打算获取的flash视频 我已经尝试过使用它来搜索PDF中的嵌入文件,但它目前对我不起作用,因为它在我创建的用于存储此类文件的文件夹中没有找到并保存任何内容 我的代码目前的样

从上周末开始,我就一直在研究PDF解析。我找到了ApachePDFBOxLibraryforJava,并且已经提取了我正在开发的项目所需的由页面、URL、图像和PDF元数据分隔的文本。现在我缺少一种从PDF中提取嵌入式flash视频的方法

我目前正在分析这个解析器是如何使用可用的pdf文件从pdf中提取富媒体的。此文件包含我打算获取的flash视频

我已经尝试过使用它来搜索PDF中的嵌入文件,但它目前对我不起作用,因为它在我创建的用于存储此类文件的文件夹中没有找到并保存任何内容

我的代码目前的样子,是根据上述方法改编的

package myproject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;

/**
 * This is an example on how to extract all embedded files from a PDF document.
 *
 */
public final class ExtractEmbeddedFiles
{
    private ExtractEmbeddedFiles()
    {
    }

    /**
     * This is the main method.
     *
     * @param args The command line arguments.
     *
     * @throws IOException If there is an error parsing the document.
     */
    public static void main( String[] args ) throws IOException
    {
            PDDocument document = null;
            try
            {
                File pdfFile = new File("/Users/henriqueferreira/Documents/PDFBoxDocuments/inOntario.pdf");
                String filePath = pdfFile.getParent() + System.getProperty("file.separator");
                document = PDDocument.load(new File("/Users/henriqueferreira/Documents/PDFBoxDocuments/inOntario.pdf"));
                PDDocumentNameDictionary namesDictionary = 
                        new PDDocumentNameDictionary( document.getDocumentCatalog() );
                PDEmbeddedFilesNameTreeNode efTree = namesDictionary.getEmbeddedFiles();
                if (efTree != null)
                {
                    Map<String, PDComplexFileSpecification> names = efTree.getNames();
                    if (names != null)
                    {
                        extractFiles(names, filePath);
                    }
                    else
                    {
                        List<PDNameTreeNode<PDComplexFileSpecification>> kids = efTree.getKids();
                        for (PDNameTreeNode<PDComplexFileSpecification> node : kids)
                        {
                            names = node.getNames();
                            extractFiles(names, filePath);
                        }
                    }
                }

                // extract files from annotations
                for (PDPage page : document.getPages())
                {
                    for (PDAnnotation annotation : page.getAnnotations())
                    {
                        if (annotation instanceof PDAnnotationFileAttachment)
                        {
                            PDAnnotationFileAttachment annotationFileAttachment = (PDAnnotationFileAttachment) annotation;
                            PDComplexFileSpecification fileSpec = (PDComplexFileSpecification) annotationFileAttachment.getFile();
                            PDEmbeddedFile embeddedFile = getEmbeddedFile(fileSpec);
                            extractFile(filePath, fileSpec.getFilename(), embeddedFile);
                        }
                    }
                }

            }
            finally
            {
                if( document != null )
                {
                    document.close();
                }
            }
    }

    private static void extractFiles(Map<String, PDComplexFileSpecification> names, String filePath) 
            throws IOException
    {
        for (Entry<String, PDComplexFileSpecification> entry : names.entrySet())
        {
            String filename = entry.getKey();
            PDComplexFileSpecification fileSpec = entry.getValue();
            PDEmbeddedFile embeddedFile = getEmbeddedFile(fileSpec);
            extractFile(filePath, filename, embeddedFile);
        }
    }

    private static void extractFile(String filePath, String filename, PDEmbeddedFile embeddedFile)
            throws IOException
    {
        String embeddedFilename = filePath + filename;
        File file = new File("/Users/henriqueferreira/Documents/PDFBoxFiles/"+filename);
        System.out.println("Writing " + embeddedFilename);
        try (FileOutputStream fos = new FileOutputStream(file))
        {
            fos.write(embeddedFile.toByteArray());
        }
    }

    private static PDEmbeddedFile getEmbeddedFile(PDComplexFileSpecification fileSpec )
    {
        // search for the first available alternative of the embedded file
        PDEmbeddedFile embeddedFile = null;
        if (fileSpec != null)
        {
            embeddedFile = fileSpec.getEmbeddedFileUnicode(); 
            if (embeddedFile == null)
            {
                embeddedFile = fileSpec.getEmbeddedFileDos();
            }
            if (embeddedFile == null)
            {
                embeddedFile = fileSpec.getEmbeddedFileMac();
            }
            if (embeddedFile == null)
            {
                embeddedFile = fileSpec.getEmbeddedFileUnix();
            }
            if (embeddedFile == null)
            {
                embeddedFile = fileSpec.getEmbeddedFile();
            }
        }
        return embeddedFile;
    }
}
包我的项目;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
导入org.apache.pdfbox.pdmodel.pdembeddedFileNameTreeNode;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
导入org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
导入org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
导入org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;
/**
*这是一个如何从PDF文档中提取所有嵌入文件的示例。
*
*/
公共最终类ExtractEmbeddedFiles
{
私有ExtractEmbeddedFiles()
{
}
/**
*这是主要的方法。
*
*@param指定命令行参数。
*
*如果解析文档时出错,@将引发IOException。
*/
公共静态void main(字符串[]args)引发IOException
{
PDDocument文件=null;
尝试
{
文件pdfFile=新文件(“/Users/henriqueferreira/Documents/PDFBoxDocuments/inOntario.pdf”);
字符串filePath=pdfFile.getParent()+System.getProperty(“file.separator”);
document=PDDocument.load(新文件(“/Users/henriqueferreira/Documents/PDFBoxDocuments/inOntario.pdf”);
PDDocumentNameDictionary NameDictionary=
新的PDDocumentNameDictionary(document.getDocumentCatalog());
PDEmbeddedFileNameTreeNode efTree=namesDictionary.getEmbeddedFiles();
if(efTree!=null)
{
Map names=efTree.getNames();
如果(名称!=null)
{
提取文件(名称、文件路径);
}
其他的
{
List kids=efTree.getKids();
用于(PDNameTreeNode节点:子节点)
{
names=node.getNames();
提取文件(名称、文件路径);
}
}
}
//从注释中提取文件
对于(PDPage:document.getPages())
{
对于(PDAnnotation:page.getAnnotations())
{
if(PDAnnotationFileAttachment的注释实例)
{
PDAnnotationFileAttachment annotationFileAttachment=(PDAnnotationFileAttachment)注释;
PDComplexFileSpecification fileSpec=(PDComplexFileSpecification)annotationFileAttachment.getFile();
PDEmbeddedFile embeddedFile=getEmbeddedFile(fileSpec);
提取文件(文件路径,fileSpec.getFilename(),embeddedFile);
}
}
}
}
最后
{
如果(文档!=null)
{
document.close();
}
}
}
私有静态文件(映射名称、字符串文件路径)
抛出IOException
{
for(条目:names.entrySet())
{
字符串文件名=entry.getKey();
PDComplexFileSpecification fileSpec=entry.getValue();
PDEmbeddedFile embeddedFile=getEmbeddedFile(fileSpec);
提取文件(文件路径、文件名、嵌入文件);
}
}
私有静态void提取文件(字符串文件路径、字符串文件名、PDEmbeddedFile embeddedFile)
抛出IOException
{
String embeddedFilename=文件路径+文件名;
File File=新文件(“/Users/henriqueferreira/Documents/PDFBoxFiles/”+文件名);
System.out.println(“写入”+嵌入文件名);
try(FileOutputStream fos=newfileoutputstream(文件))
{
写入(embeddedFile.toByteArray());
}
}
专用静态PDEmbeddedFile getEmbeddedFile(PDComplexFileSpecification fileSpec)
{
//搜索嵌入文件的第一个可用备选方案
PDEmbeddedFile embeddedFile=null;
如果(fileSpec!=null)
{
embeddedFile=fileSpec.getEmbeddedFileUnicode();
if(embeddedFile==null)
{
embeddedFile=fileSpec.getEmbeddedFileDos();
}
if(embeddedFile==null)
{
embeddedFile=fileSpec.getEmbeddedFileMac();
}
if(embeddedFile==null)
{
embeddedFile=fileSpec.getEmbeddedFileUnix();
}
if(embeddedFile==null)
{
embeddedFile=fileSpec.getEmbed
PDDocument doc = PDDocument.load(new File("Mississauga_Advantages.pdf"));
for (int p = 0; p < doc.getNumberOfPages(); ++p)
{
    PDPage page = doc.getPage(p);
    List<PDAnnotation> annotations = page.getAnnotations();
    for (PDAnnotation ann : annotations)
    {
        if ("RichMedia".equals(ann.getSubtype()))
        {
            COSArray array = (COSArray) ann.getCOSObject().getObjectFromPath("RichMediaContent/Assets/Names/");
            String name = array.getString(0);
            COSDictionary filespec = (COSDictionary) array.getObject(1);
            PDComplexFileSpecification cfs = new PDComplexFileSpecification(filespec);
            PDEmbeddedFile embeddedFile = cfs.getEmbeddedFile();
            System.out.println("page: " + (p+1) + ", name: " + name + ", size: " + embeddedFile.createInputStream().available());
        }
    }
}