Java 从pdf中提取嵌入对象

Java 从pdf中提取嵌入对象,java,pdf,itext,pdfbox,Java,Pdf,Itext,Pdfbox,我在一个pdf文件(Java)中嵌入了一个字节数组。 现在我正试图提取相同的数组。 该数组作为“电影”文件嵌入 我找不到任何关于如何做的线索 有什么想法吗 谢谢 编辑 我使用以下代码嵌入字节数组: public static void pack(byte[] file) throws IOException, DocumentException{ Document document = new Document(); PdfWriter writer = PdfWriter.g

我在一个pdf文件(Java)中嵌入了一个字节数组。 现在我正试图提取相同的数组。 该数组作为“电影”文件嵌入

我找不到任何关于如何做的线索

有什么想法吗

谢谢

编辑

我使用以下代码嵌入字节数组:

public static void pack(byte[] file) throws IOException, DocumentException{

    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
    writer.setPdfVersion(PdfWriter.PDF_VERSION_1_7);
    writer.addDeveloperExtension(PdfDeveloperExtension.ADOBE_1_7_EXTENSIONLEVEL3);

    document.open();
    RichMediaAnnotation richMedia = new RichMediaAnnotation(writer, new Rectangle(0,0,0,0));

    PdfFileSpecification fs
        = PdfFileSpecification.fileEmbedded(writer, null, "test.avi", file);
    PdfIndirectReference asset = richMedia.addAsset("test.avi", fs);
    RichMediaConfiguration configuration = new RichMediaConfiguration(PdfName.MOVIE);
    RichMediaInstance instance = new RichMediaInstance(PdfName.MOVIE);
    RichMediaParams flashVars = new RichMediaParams();
    instance.setAsset(asset);
    configuration.addInstance(instance);
    RichMediaActivation activation = new RichMediaActivation();
    richMedia.setActivation(activation);
    PdfAnnotation richMediaAnnotation = richMedia.createAnnotation();
    richMediaAnnotation.setFlags(PdfAnnotation.FLAGS_PRINT);
    writer.addAnnotation(richMediaAnnotation);
    document.close();

我已经编写了一个暴力方法来提取PDF中的所有流,并将它们存储为一个没有扩展名的文件:

public static final String SRC = "resources/pdfs/image.pdf";
public static final String DEST = "results/parse/stream%s";

public static void main(String[] args) throws IOException {
    File file = new File(DEST);
    file.getParentFile().mkdirs();
    new ExtractStreams().parse(SRC, DEST);
}

public void parse(String src, String dest) throws IOException {
    PdfReader reader = new PdfReader(src);
    PdfObject obj;
    for (int i = 1; i <= reader.getXrefSize(); i++) {
        obj = reader.getPdfObject(i);
        if (obj != null && obj.isStream()) {
            PRStream stream = (PRStream)obj;
            byte[] b;
            try {
                b = PdfReader.getStreamBytes(stream);
            }
            catch(UnsupportedPdfException e) {
                b = PdfReader.getStreamBytesRaw(stream);
            }
            FileOutputStream fos = new FileOutputStream(String.format(dest, i));
            fos.write(b);
            fos.flush();
            fos.close();
        }
    }
}
公共静态最终字符串SRC=“resources/pdfs/image.pdf”; 公共静态最终字符串DEST=“results/parse/stream%s”; 公共静态void main(字符串[]args)引发IOException{ 文件文件=新文件(DEST); 文件.getParentFile().mkdirs(); 新建ExtractStreams().parse(SRC,DEST); } 公共void解析(stringsrc,stringdest)抛出IOException{ PdfReader读取器=新PdfReader(src); PdfObject-obj;
对于(int i=1;i它是如何嵌入的?作为批注还是作为附件?如果作为批注:作为电影批注还是作为RichMedia批注?如果作为附件:作为附件批注还是作为文档级附件?如果电影是嵌入的,它作为流对象位于PDF中。获取流的字节相当容易困难的部分是提取哪个流。如果你不给我们一个线索,我们就不能给你一个。你的问题不够具体。正如布鲁诺所说,这个问题缺乏相关的细节。请看。很抱歉这个非常模糊的问题,我会试着更具体一些,因为我不太熟悉:)我嵌入了一个字节数组作为RichMedia。我发现我需要获取特定的字节流(只有一种,因为我只在空pdf中嵌入了一个字节数组)。如何获取流的字节?我知道如果我这样做,我将能够手动搜索我需要的流和“翻译”它或类似的东西(我想它叫做“Deflate”)。现在更清楚了吗?:)我编辑了帖子,并编写了我用来嵌入字节数组的代码。非常感谢你布鲁诺!我删除了“new extractStreams()”部分,只需调用parse()就可以了。这正是我所需要的!