Toevoegen PDF-bestanden aan Knack.com tabellen

In dit voorbeeld leer je hoe je PDF-bestanden van een website kunt ophalen en opslaan als veldwaardes in een Knack-tabel.

Het RIVM publiceert wekelijks een update van de epidemiologische situatie omtrent COVID-19 in PDF-formaat. Alhoewel het een automatisch gegenereerd TeX-bestand lijkt, is het lastig om hier gestructureerde informatie uit te halen. Andere databronnen van RIVM lenen zich hier beter voor.

Doel van het script is om dagelijks de meest recent gepubliceerde update te laden in het Knack bestandsveld Rapport_epidemiologische_situatie van een tabel met dagstanden. Dit veld wordt afgebeeld in Invantive SQL op meerdere velden zoals de bestandsnaam Rapport_epidemiologische_situatie_filename en de binaire inhoud Rapport_epidemiologische_situatie_data.

Een handige manier om deze PDF-bestanden te laden is om eerst het meest recente PDF-bestand te bepalen en daarna dit weg te schrijven in de juiste dagstand met een update.

De bepaling van het meeste recente PDF-bestand gebeurt door alle direct onderliggende kindpagina’s van de RIVM URL op te halen via internettable en die te beperken tot PDF-documenten. De URL metadata over laatst gewijzigd is hierbij niet bruikbaar; vaak wordt het verslag van voorgaande week/weken later nog bijgewerkt of in ieder geval de metadata gewijzigd. Het beperken tot PDF-documenten gebeurt in de select van de cursor r door twee filters:

  • URL heeft juiste formaat, eindigend op onder andere pdf.
  • het MIME-type representeert het door RIVM gebruikte MIME-type voor PDF: application/pdf.

Uit de URL wordt de datum van publicatie afgeleid met een reguliere expressie: de datum in formaat JJJJMMDD wordt losgeweekt als los tekstveld datum_gepubliceerd_c. Merk op dat binnen Invantive SQL een terugverwijzing naar een reguliere expressie match gaat met het dollarteken als in $1. De syntax met \1 wordt niet gebruikt. Deze tekst wordt vervolgens omgezet naar een datum met een to_date.

De meest recente PDF wordt bepaald door afgelopend te sorteren op de datum en alleen de eerste op te halen (de meest recente). Met een update statement wordt de bestandsinhoud en de bestandsnaam zonder URL-pad vastgelegd in de tabel Dagelijkse_updateExpanded.

begin
  for r
  in
  ( select url
    ,      basename(url) file_name
    ,      CONTENTS_BLOB
    ,      datum_gepubliceerd_c
    ,      to_date(datum_gepubliceerd_c, 'YYYYMMDD') datum_gepubliceerd
    from   ( select url
             ,      CONTENTS_BLOB
             ,      regexp_replace
                    ( url
                    , '.*/COVID-19_WebSite_rapport_wekelijks_(202[0-9][0-9][0-9][0-9][0-9])_.*pdf', '$1'
                    ) 
                    datum_gepubliceerd_c
             from   internettable
                    ( 'https://www.rivm.nl/coronavirus-covid-19'
                      || '/actueel'
                      || '/wekelijkse-update-epidemiologische-situatie-covid-19-in-nederland'
                      stay on site
                      maximum depth 2
                    )
             where  URL like '%/COVID-19_WebSite_rapport_wekelijks_%.pdf'
             and    MIME_TYPE = 'application/pdf'
             and    RETRIEVAL_SUCCESSFUL = true
           )
    order
    by     datum_gepubliceerd desc
    limit  1
  )
  loop
    update Dagelijkse_updateExpanded
    set    Rapport_epidemiologische_situatie_filename = r.file_name
    ,      Rapport_epidemiologische_situatie_data     = r.contents_blob
    where  Datum = r.datum_gepubliceerd
    ;
  end loop;
end;