利用acrobat sdk提取pdf文檔內(nèi)容
廣告:
0x00 背景
HackingTeam泄漏事件影響頗大,415.77G的內(nèi)容大多是郵件內(nèi)容,分析起來(lái)比較麻煩,因而被大多數(shù)人忽略。網(wǎng)上有很多郵件分析的文章HT郵件分析,主要是針對(duì)郵件關(guān)聯(lián)進(jìn)行分析,若對(duì)郵件內(nèi)容進(jìn)行分析則需提取郵件附件中的內(nèi)容,再針對(duì)內(nèi)容做進(jìn)一步分析。本文背景其實(shí)與上文無(wú)關(guān),只是借此提升逼格,下面將介紹如何利用acrobat SDK提取pdf文檔內(nèi)容。
0x01 acrobat導(dǎo)入
只要安裝了Adobe Acrobat,就能在其安裝目錄下找到acrobat.tlb,其中包含了adobe公司提供的接口,可對(duì)pdf進(jìn)行各種操作參考文檔,使用類向?qū)⑵鋵?dǎo)入。
提取文本內(nèi)容需導(dǎo)入CAcroApp、CAcroAVDoc、CAcroAVPageView、CAcroPDPage、CAcroPDTextSelect、CAcroHiliteList。
0x02 提取文檔內(nèi)容
首先需要”打開”pdf,核心代碼如下:
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可選擇頁(yè)數(shù)(默認(rèn)為第一頁(yè)),創(chuàng)建高亮板(CAcroHiliteList),將選擇頁(yè)數(shù)的內(nèi)容加入高亮板,然后就可以從中提取出該頁(yè)的內(nèi)容,核心代碼如下:
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)
{
//設(shè)置為第一頁(yè)
pageView.GoTo(0);
/*
這里是設(shè)置高亮板的大小
由于沒有找到如何在設(shè)置高亮板前獲取該頁(yè)內(nèi)容長(zhǎng)度的方法,所以采用設(shè)置成極大的長(zhǎng)度
如有朋友知道方法,歡迎提出相互學(xué)習(xí)
*/
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);
}
}
}
要完整提取出文檔中的全部?jī)?nèi)容,可通過CAcroPDDoc獲取pdf總頁(yè)數(shù),然后利用pageView.GoTo循環(huán)每一頁(yè),下面給出的完整工程將不包含此部分代碼。
廣告: