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).


Option Explicit

Sub leesPDF()

    Dim docPDF As Document
    
    Set docPDF = Application.Documents.Open(ThisDocument.Path & _
    "\Nederlands 2019 I_opgaven.pdf", False, , , , , , , , "PDF Files")
    
    leesKoppen docPDF
    
    Set docPDF = Nothing

End Sub

Sub leesKoppen(docPDF As Document)

    Dim p As Integer
    Dim startKop As Integer
    Dim eindKop As Integer
    
    Dim rngKop As Range
    
    For p = 1 To docPDF.Paragraphs.Count
    
        If docPDF.Paragraphs(p).Style = "Kop 2" Or _
        p = docPDF.Paragraphs.Count Then
        
            If startKop > 0 Then
            
                eindKop = p
                
                Set rngKop = docPDF.Range(docPDF.Paragraphs(startKop).Range.Start, _
                docPDF.Paragraphs(eindKop).Range.End)

            
            End If

            startKop = p
        
        End If
        
        If Not rngKop Is Nothing Then
        
            verwijderTabellen rngKop
            verwijderDubbeleRegels rngKop
            leesVragen docPDF, rngKop
        
            Set rngKop = Nothing
        
        End If
    
    Next p

End Sub

Sub verwijderTabellen(rngKop As Range)

    Dim t As Table
    
    For Each t In rngKop.Tables
    
        t.ConvertToText
    
    Next t

End Sub

Sub verwijderDubbeleRegels(rngKop As Range)

    Dim p As Integer
    
    For p = rngKop.Paragraphs.Count To 4 Step -1
    
        If rngKop.Paragraphs(p).Range.Characters.Count = 2 And _
        rngKop.Paragraphs(p - 1).Range.Characters.Count = 2 Then
        
            rngKop.Paragraphs(p).Range.Delete
        
        End If
   
    Next p
    
End Sub

Sub leesVragen(docPDF As Document, rngKop As Range)

    Dim p As Integer
    Dim startVraag As Integer
    Dim eindVraag As Integer
    
    Dim rngVraag As Range
    
    For p = 3 To rngKop.Paragraphs.Count
        
        If rngKop.Paragraphs(p).Range.Characters.Count = 2 Or _
        p = rngKop.Paragraphs.Count Then
        
            If startVraag > 0 Then
            
                eindVraag = p
                
                Set rngVraag = docPDF.Range(rngKop.Paragraphs(startVraag).Range.Start, _
                rngKop.Paragraphs(eindVraag).Range.End)
                
                If rngVraag.Characters.Count > 100 Then
                
                    rngVraag.Select
                
                End If
            
            End If
        
            startVraag = p
        
        End If
        
        If Not rngVraag Is Nothing Then
        
            Set rngVraag = Nothing
            
        End If
    
    Next p

End Sub

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