从pdf提取嵌入式对象

Itai Soudry

我已经将字节数组嵌入到pdf文件(Java)中。现在,我尝试提取相同的数组。该阵列被嵌入为“ MOVIE”文件。

我找不到有关如何执行此操作的任何线索...

有任何想法吗?

谢谢!

编辑

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

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();
布鲁诺·洛瓦吉(Bruno Lowagie)

我编写了一种蛮力方法来提取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();
        }
    }
}

请注意,我将所有作为流的PDF对象作为一个PRStream对象。我还使用两种不同的方法:

  • 当我使用PdfReader.getStreamBytes(stream)iText时,它会查看过滤器例如:页面内容流包含使用压缩的PDF语法/FlateDecode通过使用PdfReader.getStreamBytes(stream),您将获得未压缩的PDF语法。
  • iText中不支持所有过滤器。例如/DCTDecode,这是用于在PDF内存储JPEG的过滤器。您为什么以及如何“解码”这样的流?您不会,那是当我们使用PdfReader.getStreamBytesRaw(stream)那一种方法时,您也需要从PDF中获取AVI字节。

这个例子已经为您提供了提取PDF流肯定需要的方法。现在由您来找到所需流的路径。这就需要iText RUPS使用iText RUPS,您可以查看PDF文件的内部结构。在您的情况下,您需要按以下问题中的步骤查找批注:现有pdf的所有链接都将action属性更改为继承zoom-iText库

您遍历页面字典,然后遍历/Annots该字典数组(如果存在),但是您不必检查/Link注解(这是我所指的问题),而是必须检查/RichMedia注解并从那里进行检查检查资产,直到找到包含AVI文件的流。RUPS将向您展示如何深入了解注释词典。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章