利用acrobat SDK提取pdf文档内容

0x00 背景

  HackingTeam泄漏事件影响颇大,415.77G的内容大多是邮件内容,分析起来比较麻烦,因而被大多数人忽略。网上有很多邮件分析的文章HT邮件分析,主要是针对邮件关联进行分析,若对邮件内容进行分析则需提取邮件附件中的内容,再针对内容做进一步分析。本文背景其实与上文无关,只是借此提升逼格,下面将介绍如何利用acrobat SDK提取pdf文档内容。

0x01 acrobat导入

  只要安装了Adobe Acrobat,就能在其安装目录下找到acrobat.tlb,其中包含了adobe公司提供的接口,可对pdf进行各种操作参考文档,使用类向导将其导入。
  提取文本内容需导入CAcroApp、CAcroAVDoc、CAcroAVPageView、CAcroPDPage、CAcroPDTextSelect、CAcroHiliteList。

0x02 提取文档内容

  首先需要”打开”pdf,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
CAcroApp *pAcrpApp = new CAcroApp;
COleException e;
pAcrpApp->CreateDispatch("AcroExch.App",&e);
CAcroAVDoc *pAvdoc = new CAcroAVDoc;
pAvdoc->CreateDispatch("AcroExch.AVDoc",&e);
//打开pdf,其中PDFName为全路径
if (!pAvdoc->Open(PDFName,NULL))
{
printf("open pdf failed");
...
return 0;
}

  打开文档后,通过pAvdoc可选择页数(默认为第一页),创建高亮板(CAcroHiliteList),将选择页数的内容加入高亮板,然后就可以从中提取出该页的内容,核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CAcroAVPageView pageView;
CAcroPDPage page;
CAcroPDTextSelect* textSelect = new CAcroPDTextSelect;
CAcroHiliteList* hilite = new CAcroHiliteList;
long selectionSize;
pageView.AttachDispatch(pAvdoc->GetAVPageView(),TRUE);
hilite->CreateDispatch("AcroExch.HiliteList");
if (hilite)
{
//设置为第一页
pageView.GoTo(0);
/*
这里是设置高亮板的大小
由于没有找到如何在设置高亮板前获取该页内容长度的方法,所以采用设置成极大的长度
如有朋友知道方法,欢迎提出相互学习
*/
hilite->Add(0,4000);
page.AttachDispatch(pageView.GetPage(), TRUE);
textSelect->AttachDispatch(page.CreateWordHilite(hilite->m_lpDispatch));
pAvdoc->SetTextSelection(textSelect->m_lpDispatch);
selectionSize = textSelect->GetNumText();
if (selectionSize && strText.GetLength() < 4000)
{
for(int i = 0;i < selectionSize;i ++)
{
strText += textSelect->GetText(i);
}
}
}

  程序效果如下:


GetPDFConTent

  要完整提取出文档中的全部内容,可通过CAcroPDDoc获取pdf总页数,然后利用pageView.GoTo循环每一页,下面给出的完整工程将不包含此部分代码。
完整工程下载