如何使用Excel VBA搜索和突出显示PDF中的文本

时间:2014-04-01 07:27:54

标签: vba pdf com highlight acrobat

是的,所以经过几个小时的搜索;我没有为excel vba提供任何东西,我觉得这很令人惊讶。找到了一些我试图移植但没有运气的vbs。我已经设法将pdf文本导入到工作表中并进行搜索,这很好;但这显然不允许我实际突出显示pdf。

我要做的是打开PDF文档,搜索关键字,然后突出显示这些单词并保存。我有adobe acrobat X,所以必须有某种API才能让我用excel vba做到这一点?我将不得不使用像iText这样的开源库;我不愿意。

我看到的一些vbs涉及逐字逐句查找文本,然后在其周围绘制矩形并使用javascript着色,这似乎不必要地复杂化(无论如何都无法让端口工作......)。

澄清: 我不想在excel中突出显示文本,我想在PDF上突出显示它。我只是在Excel中读取它来搜索文本并查看它是否在PDF中,因为我不知道如何做到这一点。

PS:能够在图像pdf上使用OCR也很不错。

3 个答案:

答案 0 :(得分:0)

Excel无法清晰地打开pdf文件格式。

为了做你想做的事,你需要某种PDF转换器来将文档翻译成Excel可以读取的格式(例如xls或txt)。然后你可以使用普通的.Find和.Format方法来完成你的任务。

以下是我从快速Google搜索中找到的一些免费转换器(虽然注意我没有使用过这些转换器,因此您可能希望进行其他研究)

http://www.freepdfconvert.com/‎
http://www.pdf995.com/download.html
http://www.cutepdf.com/
http://www.primopdf.com/
http://sourceforge.net/projects/pdfcreat... 

但请注意,以您打开它们的格式保存它们很可能是不可能的。这完全取决于转换器的好坏程度。最终,我不认为Excel是您想要用于此任务的工具。

答案 1 :(得分:0)

远程控制Acrobat有一些可能性。在Mac上,它是通过AppleScript,在Windows上,它是通过VB / VBS(如果我没记错的话)。无论如何,您可以运行Acrobat JavaScript。

您可以从Adobe网站下载Acrobat SDK,并查看Documentation文件夹。

尽管没有那么好的经历,但这是一种方法:循环遍历文档的所有页面,遍历实际页面上的所有“单词”,读出找到的边界框的坐标单词(也称为“四边形”),可能与其他“单词”进行一些比较,以确定这些“单词”是否属于一起。最后使用读出的四边形作为坐标创建一个Highlight Annotation。

在PDF文档中查找单词的另一种可能性是使用Redaction工具的标记部分(在删除和写回编校文档之前停止编校过程)。然后,您将运行一个枚举所有Redaction类型注释的Acrobat JavaScript,并用类似的Highlight注释替换它们。

答案 2 :(得分:0)

好的,玩了一下我已经拥有的代码和js annots。 附上你会发现一个VBScript可以标记/突出显示一个永久的单词。它可以很容易地更改为仅标记一个单词。在AcroJS帮助文件中,您可以找到标记装备的一些选项。

我写VBA的VBS代码就像。因此,您可以将其直接复制到IDE中。

享受,莱因哈德

 '// Save this as xxx.vbs and start with Double Click
 '// Acrobat must be opend before with an active document!! -otherwise error-

wordTF = "Reinhard" '//word to find
pdfText = ""

set WshShell = CreateObject ("Wscript.Shell")
WshShell.AppActivate("Adobe Acrobat")
WScript.Sleep 500

'// get the active Document
Set AcroApp = CreateObject("AcroExch.App")
Set AVDoc = AcroApp.GetActiveDoc
Set PDDoc = AVDoc.GetPDDoc
Set AForm = CreateObject("AFormAut.App") 'connect to Form API for later use

maxPages = PdDoc.GetNumPages
for p = 0 to maxPages - 1  '// start the page loop
    Set PdfPage = PDDoc.AcquirePage(p) '// p  = Pagenumber (zero based)
    Set PageHL = CreateObject("AcroExch.HiliteList")  '// created to get the page text
    PageHLRes = PageHL.Add(0,9000) '<<--SET in FILE! (Start,END[9000=All])
    Set PageSel = PdfPage.CreatePageHilite(PageHL)

    for i = 0 to PageSel.Getnumtext - 1   '// start the word loop on current page
        word = PageSel.getText(i)         '// get one word
        pdfText = pdfText & word          '// gather words on page

        if instr(word, wordTF) then       '// used instr because the "word" you may get as "word "
            msgbox("add:""" &word &"""")                Set wordToHl = CreateObject("AcroExch.HiliteList") '// created to get the word on list
            wordToHl.Add i, 1 'Hilite the word Reinhard
            Set wordHl = PdfPage.CreateWordHilite(wordToHl)
            Set rect = wordHl.GetBoundingRect
            msgbox("left:" &rect.Left &" bot:" &rect.bottom &" right:"&rect.Right &" top:" &rect.Top)
            AVDoc.SetTextSelection(wordHl)  '// highlight the word (not really needed)
            AVDoc.ShowTextSelect()          '// show highlighted text (not really needed)
              '// write and execute js to mark permanent (to lazy to translate to jso)
            ex = " // set annot for text selection " &vbLf _
                & "var sqannot = this.addAnnot({type: ""Square"", page: 1, " &vbLf _
                & "rect: [" &rect.left &", "& rect.top &", " &rect.right &", " &rect.bottom &"], " &vbLf _
                & "name: ""p" &p &"i" &i &"""});"
            msgbox(ex)
            AForm.Fields.ExecuteThisJavaScript ex
        end if '// word found
    Next  '// get next word
    msgBox(pdfText)
    pdfText = ""
next '// get next page
msgbox("Done!")