【问题标题】:How to search and highlight text in PDF using Excel VBA如何使用 Excel VBA 在 PDF 中搜索和突出显示文本
【发布时间】:2014-05-11 20:15:17
【问题描述】:

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

我要做的是打开 PDF 文档,在其中搜索关键字,然后突出显示这些字词并保存。我有adobe acrobat X,所以一定有某种API可以让我用excel vba做到这一点?我是否将不得不使用某种开源库,例如 iText?我宁愿不要。

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

澄清: 我不想在 excel 中突出显示文本,我想在 PDF 中突出显示它。我只是将它读入 Excel 以搜索文本并查看它是否在 PDF 中,因为我不知道该怎么做。

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

【问题讨论】:

    标签: vba pdf com highlight acrobat


    【解决方案1】:

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

    VBS 代码我写的 VBA 喜欢。因此,您可以将其直接复制到您的 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!")
    

    【讨论】:

    • 非常感谢您提供未来的代码示例!
    • 设置 wordHl = PdfPage.CreateWordHilite(wordToHl) - 它什么也不返回。我们能做什么?
    【解决方案2】:

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

    您可以从 Adob​​e 网站下载 Acrobat SDK,并查看文档文件夹。

    尽管体验不是很好,但这是一种方法:遍历文档的所有页面,遍历实际页面上的所有“单词”,读出找到的边界框的坐标word(也称为“quads”),可能与其他“words”进行一些比较,以确定这些“words”是否属于一起。最后使用作为坐标读出的四边形创建一个突出显示注释。

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

    【讨论】:

    • 谢谢@Max Wyss,难道根本不可能公开 Acrobat Reader 的内置搜索工具吗?
    • 看来我应该可以通过 IAC 做到这一点
    • 我也这么认为,这是一种遵循的方式。祝你好运!
    • 说起来容易做起来难!我不敢相信没有任何例子可以完全按照我的意愿去做。这一定是一个普遍的要求!
    • 我同意,文档中的代码示例很少……如果是 AppleScript,我可以提供帮助……
    【解决方案3】:

    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 是您要用于此任务的工具。

    【讨论】:

    • 谢谢,但我可能不太清楚抱歉。我不想在 excel 中突出显示文本,我想在 PDF 中突出显示它。我只是将它读入 Excel 以搜索文本并查看它是否在 PDF 中,因为我不知道该怎么做。
    • 我理解你想要做什么。我告诉你,你可以做到这一点的唯一方法是转换为 Excel,在 Excel 中进行更改,然后打印为 PDF。在较新版本的 Excel 中,您可以打印为 PDF,但不能编辑 PDF 文档。要执行您真正需要的操作,您需要使用更高级的图像工具,例如 Adob​​e Acrobat Developer 或类似的工具。即便如此,我也不确定您可以使用哪些脚本选项。
    • 谢谢伙计,但转换为 Excel 并返回不是我的选择,因为我不仅使用文本,还使用技术图纸。
    • 我完全同意...我认为您确实需要消除对 Excel 的依赖。任何好的 IDE 都会带有自己的查找功能,所以我的建议是找到专门为图像编辑制作的不同开发工具。从设计的角度来看,让 Excel 与其他一些工具对话以便您可以使用一些 VBA 编码功能并不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2013-11-20
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多