Извлечь 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
содержит.
Чтобы получить любые объекты словаря, вы можете использовать GetAsDict
метод, передаваемый в PdfName
который соответствует.
Спускаясь ниже уровня, вы можете увидеть, что он содержит EmbeddedFiles
и так далее.
Есть несколько PdfName
имена, есть даже Flash.
Поскольку структура любого документа может отличаться, это будет просто случай исследования структуры и использования правильных параметров для GetAsDict
для того, чтобы прочитать файлы.