2014-02-14 3 views
2

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

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

С наилучшими пожеланиями,

Raghu.M

ответ

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) чек вокруг имен файлов перед извлечением.

Update

Хорошо, это, как я бы выяснить это, если выше подход не работает.

Файлы должны быть размещены в другом месте в каталоге, не видя файл, как я подхожу к нему.

Я бы добавил точку останова после того, как корень разрешен, затем перейдите в нее, чтобы узнать, могу ли я найти, где находятся файлы swf.

Если вы посмотрите на root.Keys, вы увидите, что содержит Catalog.

root.Keys

Чтобы извлечь любые объекты словаря вы можете использовать GetAsDict метод, проходящий в PdfName, который соответствует.

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

enter image description here

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

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

+0

Большое вам спасибо за помощь, я проверю его и дам вам знать .... – Raghurocks

+0

PdfDictionary names = root.GetAsDict (PdfName.NAMES); здесь имена нулевые, поэтому я получаю нулевую ошибку ссылки в PdfDictionary embedded = names.GetAsDict (PdfName.EMBEDDEDFILES); – Raghurocks

+0

Позвольте мне сказать вам одно: файл swf не похож на приложение в pdf, оно встроено в swf pdf. Надеюсь, у меня есть смысл .... – Raghurocks

Смежные вопросы