从PDF中提取SWF文件

时间:2014-02-14 13:02:31

标签: c# asp.net pdf itextsharp flash

我已经实现了使用iTextsharp将swf文件添加到pdf,我的问题是,是否可以进行逆向工程,例如,如果我将pdf作为输入,我必须从中获取swf文件,如果是的我怎么样能做到吗?

如何开始的任何想法,将不胜感激。

亲切的问候,

Raghu.M

1 个答案:

答案 0 :(得分:2)

这是一个工作示例,在此处获取此嵌入式pdf(我找到的第一个):

http://www.opf-labs.org/format-corpus/pdfCabinetOfHorrors/fileAttachment.pdf

并提取嵌入的文件,在本例中为KSBASE.WQ2文件。

    public static void ExtractAttachments(String src, String dir)
    {

        PdfReader reader = new PdfReader(string.Format("{0}\\{1}", dir, src));
        PdfDictionary root = reader.Catalog;
        PdfDictionary names = root.GetAsDict(PdfName.NAMES);
        PdfDictionary embedded = names.GetAsDict(PdfName.EMBEDDEDFILES);
        PdfArray filespecs = embedded.GetAsArray(PdfName.NAMES);
        for (int i = 0; i < filespecs.Size; )
        {
            ExtractAttachment(reader, dir, filespecs.GetAsString(i++),
            filespecs.GetAsDict(i++));

        }
    }

    protected static void ExtractAttachment(PdfReader reader, string dir, PdfString name, PdfDictionary filespec)
    {
        PRStream stream;
        FileStream fos;
        String filename;
        PdfDictionary refs = filespec.GetAsDict(PdfName.EF);
        foreach(PdfName key in refs.Keys) {
            stream = (PRStream)PdfReader.GetPdfObject(refs.GetAsIndirectObject(key));
            filename = filespec.GetAsString(key).ToString();
            // here you can do an filename.Contains(".swf) check
            var fileBytes = PdfReader.GetStreamBytes(stream);
            File.WriteAllBytes(string.Format("{0}\\{1}", dir, filename), fileBytes);
            }
        }

你可以这样称呼:

var dir = "C:\\temp\\PdfExtract";
ExtractAttachments("fileAttachment.pdf", dir);

在解压缩之前,您只需在文件名周围添加filename.Contains(".swf)检查。

<强>更新

好的,如果上述方法不起作用,我就会弄明白这一点。

文件必须位于目录中的不同位置,而不会看到文件,这就是我接近它的方式。

我会在root解析后添加一个断点,然后进入它以查看我是否能找到swf文件的位置。

如果您查看root.Keys,您会看到Catalog包含的内容。

root.Keys

要检索任何字典对象,您可以使用传递匹配的GetAsDict的{​​{1}}方法。

进一步降低级别,您可以看到它包含PdfName等等。

enter image description here

有几个EmbeddedFiles名称,甚至还有Flash名称。

由于任何文档的结构可能不同,因此只需调查结构并使用正确的参数PdfName来读取文件。