Это рабочий пример, который принимает этот встроенный 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
.
Чтобы извлечь любые объекты словаря вы можете использовать GetAsDict
метод, проходящий в PdfName
, который соответствует.
Спустившись на уровень ниже, вы увидите, что он содержит EmbeddedFiles
и так далее.
Есть несколько PdfName
имен, есть даже флэш один.
Поскольку структура любого документа может быть разной, это будет просто случай исследования структуры и использования правильных параметров для GetAsDict
, чтобы прочитать файлы.
Большое вам спасибо за помощь, я проверю его и дам вам знать .... – Raghurocks
PdfDictionary names = root.GetAsDict (PdfName.NAMES); здесь имена нулевые, поэтому я получаю нулевую ошибку ссылки в PdfDictionary embedded = names.GetAsDict (PdfName.EMBEDDEDFILES); – Raghurocks
Позвольте мне сказать вам одно: файл swf не похож на приложение в pdf, оно встроено в swf pdf. Надеюсь, у меня есть смысл .... – Raghurocks