我已经实现了使用iTextsharp将swf文件添加到pdf,我的问题是,是否可以进行逆向工程,例如,如果我将pdf作为输入,我必须从中获取swf文件,如果是的我怎么样能做到吗?
如何开始的任何想法,将不胜感激。
亲切的问候,
Raghu.M
答案 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
包含的内容。
要检索任何字典对象,您可以使用传递匹配的GetAsDict
的{{1}}方法。
进一步降低级别,您可以看到它包含PdfName
等等。
有几个EmbeddedFiles
名称,甚至还有Flash名称。
由于任何文档的结构可能不同,因此只需调查结构并使用正确的参数PdfName
来读取文件。