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.
