PDF naar Word VBA

In dit artikel wordt uiteengezet hoe - specifieke onderdelen - uit een PDF document ingelezen kunnen worden met behulp van Word VBA.

Vooraf is het wellicht van belang om aan te geven dat een PDF document geen dataset is, zoals bijvoorbeeld een CSV document. Om die reden laat een PDF document zich niet altijd even makkelijk inlezen.

Als voorbeeld worden de vragen ingelezen van een geschiedenis examen. Een vraag bestaat uit een inleiding en wordt als geheel gekenmerkt door een witregel (lege paragraaf) boven en onder. Gezien deze opmaak door het gehele document consistent voorkomt kunnen de vragen makkelijk ingelezen worden.

In de praktijk is gebleken dat tussen vraag 7 en 8 geen witregel stond. Het document is dus helaas niet 100% consistent qua opmaak zoals eerder verwacht.

Om dit automatiseringsproces glad te strijken was het noodzakelijk om dubbele wit regels te verwijderen (verwijderDubbeleRegels), alsmede de tabellen (verwijderTabellen).

001Option Explicit
002 
003Sub leesPDF()
004 
005    Dim docPDF As Document
006     
007    Set docPDF = Application.Documents.Open(ThisDocument.Path & _
008    "\Nederlands 2019 I_opgaven.pdf", False, , , , , , , , "PDF Files")
009     
010    leesKoppen docPDF
011     
012    Set docPDF = Nothing
013 
014End Sub
015 
016Sub leesKoppen(docPDF As Document)
017 
018    Dim p As Integer
019    Dim startKop As Integer
020    Dim eindKop As Integer
021     
022    Dim rngKop As Range
023     
024    For p = 1 To docPDF.Paragraphs.Count
025     
026        If docPDF.Paragraphs(p).Style = "Kop 2" Or _
027        p = docPDF.Paragraphs.Count Then
028         
029            If startKop > 0 Then
030             
031                eindKop = p
032                 
033                Set rngKop = docPDF.Range(docPDF.Paragraphs(startKop).Range.Start, _
034                docPDF.Paragraphs(eindKop).Range.End)
035 
036             
037            End If
038 
039            startKop = p
040         
041        End If
042         
043        If Not rngKop Is Nothing Then
044         
045            verwijderTabellen rngKop
046            verwijderDubbeleRegels rngKop
047            leesVragen docPDF, rngKop
048         
049            Set rngKop = Nothing
050         
051        End If
052     
053    Next p
054 
055End Sub
056 
057Sub verwijderTabellen(rngKop As Range)
058 
059    Dim t As Table
060     
061    For Each t In rngKop.Tables
062     
063        t.ConvertToText
064     
065    Next t
066 
067End Sub
068 
069Sub verwijderDubbeleRegels(rngKop As Range)
070 
071    Dim p As Integer
072     
073    For p = rngKop.Paragraphs.Count To 4 Step -1
074     
075        If rngKop.Paragraphs(p).Range.Characters.Count = 2 And _
076        rngKop.Paragraphs(p - 1).Range.Characters.Count = 2 Then
077         
078            rngKop.Paragraphs(p).Range.Delete
079         
080        End If
081    
082    Next p
083     
084End Sub
085 
086Sub leesVragen(docPDF As Document, rngKop As Range)
087 
088    Dim p As Integer
089    Dim startVraag As Integer
090    Dim eindVraag As Integer
091     
092    Dim rngVraag As Range
093     
094    For p = 3 To rngKop.Paragraphs.Count
095         
096        If rngKop.Paragraphs(p).Range.Characters.Count = 2 Or _
097        p = rngKop.Paragraphs.Count Then
098         
099            If startVraag > 0 Then
100             
101                eindVraag = p
102                 
103                Set rngVraag = docPDF.Range(rngKop.Paragraphs(startVraag).Range.Start, _
104                rngKop.Paragraphs(eindVraag).Range.End)
105                 
106                If rngVraag.Characters.Count > 100 Then
107                 
108                    rngVraag.Select
109                 
110                End If
111             
112            End If
113         
114            startVraag = p
115         
116        End If
117         
118        If Not rngVraag Is Nothing Then
119         
120            Set rngVraag = Nothing
121             
122        End If
123     
124    Next p
125 
126End Sub

Tip: volgens dit LinkedIn-artikel zal in een toekomstige versie van Excel een ingebouwde functionaliteit komen om PDF documenten in te lezen.