Here it is again.
Sub FindTextInPDF()
'----------------------------------------------------------------------------------------
'This macro can be used to find a specific TEXT (more than one word) in a PDF document.
'The macro opens the PDF, finds the specified text (the first instance), scrolls so
'that it is visible and highlights it.
'The macro uses the FindText method (see the code below for more info).
'Note that in some cases it doesn't work (doesn't highlight the text), so in those
'cases prefer the SearchTextInPDF macro, if you have only ONE WORD to find!
'The code uses late binding, so no reference to external library is required.
'However, the code works ONLY with Adobe Professional, so don't try to use it with
'Adobe Reader because you will get an "ActiveX component can't create object" error.
'Written by: Christos Samaras
'Date: 04/05/2014
'e-mail: [email protected]
'site: http://www.myengineeringworld.net
'----------------------------------------------------------------------------------------
'Declaring the necessary variables.
Dim TextToFind As String
Dim PDFPath As String
Dim App As Object
Dim AVDoc As Object
Dim SpecFl As String
Dim i As Integer
Dim acrobatID
Dim acrobatInvokeCmd As String
Dim acrobatLocation As String
Dim workaroundloop As Integer
Dim lRow As Long
Dim shData As Worksheet
Set shData = ThisWorkbook.Sheets("Sheet1")
lRow = shData.Cells(shData.Rows.Count, 1).End(xlUp).Row
acrobatLocation = "C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
acrobatInvokeCmd = acrobatLocation & " " & PDFPath
For i = 2 To lRow
'Specify the text you want to search.
'TextToFind = "Christos Samaras"
'Using a range:
TextToFind = ThisWorkbook.Sheets("Sheet1").Cells(i, 2).Value
SpecFl = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value & ".pdf"
'Specify the path of the sample PDF form.
'Full path example:
'PDFPath = "C:\Users\Christos\Desktop\How Software Companies Die.pdf"
'Using workbook path:
'PDFPath = ThisWorkbook.Path & "\" & "How Software Companies Die.pdf"
'Using a range:
PDFPath = ThisWorkbook.Path & "\" & SpecFl
For workaroundloop = 1 To 1
'Check if the file exists.
If Dir(PDFPath) = "" Then
Cells(i, 3).Value = "Cannot find the PDF file!"
Exit For
End If
'Check if the input file is a PDF file.
If LCase(Right(PDFPath, 3)) <> "pdf" Then
Cells(i, 3).Value = "The input file is not a PDF file!"
'Close the Acrobat application.
'Exit Sub
Exit For
End If
Next
On Error Resume Next
'Initialize Acrobat by creating the App object.
Set App = CreateObject("AcroExch.App")
'Check if the object was created. In case of error release the object and exit.
If Err.Number <> 0 Then
MsgBox "Could not create the Adobe Application object!", vbCritical, "Object Error"
Set App = Nothing
Exit Sub
End If
'Create the AVDoc object.
Set AVDoc = CreateObject("AcroExch.AVDoc")
'Check if the object was created. In case of error release the objects and exit.
If Err.Number <> 0 Then
MsgBox "Could not create the AVDoc object!", vbCritical, "Object Error"
Set AVDoc = Nothing
Set App = Nothing
Exit Sub
End If
On Error GoTo 0
'Open the PDF file.
If AVDoc.Open(PDFPath, "") = True Then
'Open successful, bring the PDF document to the front.
AVDoc.BringToFront
'Use the FindText method in order to find and highlight the desired text.
'The FindText method returns true if the text was found or false if it was not.
'Here are the 4 arguments of the FindText methd:
'Text to find: The text that is to be found (in this example the TextToFind variable).
'Case sensitive: If true, the search is case-sensitive. If false, it is case-insensitive (in this example is True).
'Whole words only: If true, the search matches only whole words. If false, it matches partial words (in this example is True).
'Search from 1st page: If true, the search begins on the first page of the document. If false, it begins on the current page (in this example is False).
If AVDoc.FindText(TextToFind, False, True, True) = True Then
'Text was not found, close the PDF file without saving the changes.
AVDoc.Close True
'Close the Acrobat application.
App.Exit
'Release the objects.
Set AVDoc = Nothing
Set App = Nothing
'Inform the user.
Cells(i, 3).Value = "Text is found in the PDF file"
Else
'Text was not found, close the PDF file without saving the changes.
AVDoc.Close True
'Close the Acrobat application.
App.Exit
'Release the objects.
Set AVDoc = Nothing
Set App = Nothing
'Inform the user.
Cells(i, 3).Value = "Text not found in the PDF file"
End If
Else
Application.Wait Now() + TimeValue("00:00:05")
Application.SendKeys ("~")
'Unable to open the PDF file, close the Acrobat application.
App.Exit
'Release the objects.
Set AVDoc = Nothing
Set App = Nothing
'Inform the user.
Cells(i, 3).Value = "Could not open the PDF file!"
End If
Next i
End Sub
So when one starts executing this command by command, the following happens. You get to this:
'Open the PDF file.
If AVDoc.Open(PDFPath, "") = True Then
Acrobat tries to open the PDF file, but it is a corrupted (non-PDF) file, Acrobat dialog box pops up, VBA freezes since someone has to click on Acrobat and click OK on the dialog box that says the file is corrupted, then VBA resumes with the code. This is the drama.
Bookmarks