Import des fascicules "saisons culturelles" #34

Open
opened 2023-11-17 11:12:14 +01:00 by SebF · 2 comments
Collaborator

Si les pdfs sont bien structurés, py-pdf-parser permet de les parser.

Si les pdfs sont bien structurés, [py-pdf-parser](https://py-pdf-parser.readthedocs.io/en/latest/) permet de les parser.
SebF added the
importation
label 2023-11-17 11:12:14 +01:00
Author
Collaborator

Échecs sur mes premiers tests, les pdf des saisons culturelles ne sont pas reconnus par cette bibliothèque :(

Échecs sur mes premiers tests, les pdf des saisons culturelles ne sont pas reconnus par cette bibliothèque :(
Author
Collaborator

Exemple de parsing d’un pdf bien structuré (agenda FUB)

#!/usr/bin/env python3

from py_pdf_parser.loaders import load_file
from py_pdf_parser.visualise import visualise
from icalendar import Calendar, Event
from datetime import datetime, time
import datefinder

"""
    pour scrapper le pdf et créer un fichier ics du même nom.
    /!\ pour l’import nextcloud, d’abord passer par un import/export thunderbird
"""

docname = "programme_complet_-_webinaires_et_temps_dechange_s2_2023"
document = load_file(docname + ".pdf")


def moisVersIndex(nomMois):
    return {
        "janvier": 1,
        "février": 2,
        "mars": 3,
        "avril": 4,
        "mai": 5,
        "juin": 6,
        "juillet": 7,
        "août": 8,
        "septembre": 9,
        "octobre": 10,
        "novembre": 11,
        "décembre": 12,
    }[nomMois]


cal = Calendar()
# Some properties are required to be compliant
cal.add("prodid", "-//My calendar product//example.com//")
cal.add("version", "2.0")


# on se repère sur les liens de connexion
links_refs = document.elements.filter_by_text_contains("Lien de connexion : ")


for link_ref in links_refs:
    event = Event()

    # la date est juste avant le lien
    ligne_date = document.elements.move_backwards_from(link_ref)
    split_dates = ligne_date.text().split()
    jour = split_dates[1]
    mois = moisVersIndex(split_dates[2])
    heure_fin = split_dates[-1].replace("h", "").ljust(4, "0")
    heure_debut = split_dates[-3].replace("h", "").ljust(4, "0")

    event.add(
        "dtstart",
        datetime(
            int(2023), int(mois), int(jour), int(heure_debut[:2]), int(heure_debut[2:])
        ),
    )
    event.add(
        "dtend",
        datetime(
            int(2023), int(mois), int(jour), int(heure_fin[:2]), int(heure_fin[2:])
        ),
    )

    # le titre est juste avant la date
    titre = document.elements.move_backwards_from(ligne_date)
    event.add("summary", titre.text().replace("\n", ""))
    event.add("name", titre.text().replace("\n", ""))

    # la description est juste après le lien
    description = document.elements.move_forwards_from(link_ref)
    event.add(
        "description",
        description.text().replace("\n", "").replace("\\", "")
        # ajout du lien dans la description
        + "\r" + link_ref.text().replace("\n", ""),
    )

    cal.add_component(event)


f = open(docname + ".ics", "wb")
f.write(cal.to_ical())
f.close()

Exemple de parsing d’un pdf bien structuré (agenda FUB) ``` #!/usr/bin/env python3 from py_pdf_parser.loaders import load_file from py_pdf_parser.visualise import visualise from icalendar import Calendar, Event from datetime import datetime, time import datefinder """ pour scrapper le pdf et créer un fichier ics du même nom. /!\ pour l’import nextcloud, d’abord passer par un import/export thunderbird """ docname = "programme_complet_-_webinaires_et_temps_dechange_s2_2023" document = load_file(docname + ".pdf") def moisVersIndex(nomMois): return { "janvier": 1, "février": 2, "mars": 3, "avril": 4, "mai": 5, "juin": 6, "juillet": 7, "août": 8, "septembre": 9, "octobre": 10, "novembre": 11, "décembre": 12, }[nomMois] cal = Calendar() # Some properties are required to be compliant cal.add("prodid", "-//My calendar product//example.com//") cal.add("version", "2.0") # on se repère sur les liens de connexion links_refs = document.elements.filter_by_text_contains("Lien de connexion : ") for link_ref in links_refs: event = Event() # la date est juste avant le lien ligne_date = document.elements.move_backwards_from(link_ref) split_dates = ligne_date.text().split() jour = split_dates[1] mois = moisVersIndex(split_dates[2]) heure_fin = split_dates[-1].replace("h", "").ljust(4, "0") heure_debut = split_dates[-3].replace("h", "").ljust(4, "0") event.add( "dtstart", datetime( int(2023), int(mois), int(jour), int(heure_debut[:2]), int(heure_debut[2:]) ), ) event.add( "dtend", datetime( int(2023), int(mois), int(jour), int(heure_fin[:2]), int(heure_fin[2:]) ), ) # le titre est juste avant la date titre = document.elements.move_backwards_from(ligne_date) event.add("summary", titre.text().replace("\n", "")) event.add("name", titre.text().replace("\n", "")) # la description est juste après le lien description = document.elements.move_forwards_from(link_ref) event.add( "description", description.text().replace("\n", "").replace("\\", "") # ajout du lien dans la description + "\r" + link_ref.text().replace("\n", ""), ) cal.add_component(event) f = open(docname + ".ics", "wb") f.write(cal.to_ical()) f.close() ```
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: jmtrivial/agenda_culturel#34
No description provided.