Извлечь SWF-файл из PDF

Я реализовал добавление SWF-файлов в PDF с помощью iTextsharp, и мой вопрос заключается в том, можно ли сделать обратный инжиниринг, например, если я даю pdf в качестве входных данных, я должен получить SWF-файлы из него, если да, как я могу это сделать?

Любая идея о том, как начать, будет принята с благодарностью.

С уважением,

Raghu.M

1 ответ

Решение

Это рабочий пример, который берет этот встроенный 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 метод, передаваемый в PdfName который соответствует.

Спускаясь ниже уровня, вы можете увидеть, что он содержит EmbeddedFiles и так далее.

введите описание изображения здесь

Есть несколько PdfName имена, есть даже Flash.

Поскольку структура любого документа может отличаться, это будет просто случай исследования структуры и использования правильных параметров для GetAsDict для того, чтобы прочитать файлы.

Другие вопросы по тегам