Bij het afnemen van een examen dient elke student één of meer pagina's met antwoorden in. Tijdens het beoordelen van het examen wordt bij elk antwoord een score geschreven die de student voor die vraag behaald heeft, eventueel aangevuld met wat bijkomende opmerkingen. Als feedback krijgt elke individuele student een PDF-bestand doorgestuurd met een scan van zijn of haar antwoorden, en de scores en opmerkingen die de verbeteraars daarop hebben aangebracht.

Om dit logistiek te kunnen bolwerken wordt eerst de volledige stapel met alle antwoorden van alle studenten in één keer ingescand. Daarna worden de gescande pagina's per student uitgesplitst. Nu kan het echter gebeuren dat al die pagina's tijdens het verbeteren willekeurig door elkaar geraakt zijn. Bijvoorbeeld omdat de verschillende vragen door verschillende personen verbeterd worden en de ingediende antwoorden eerst per vraag gerangschikt werden, of gewoon omdat de stapel papier per ongeluk uit iemands handen is gevallen. Bovendien kan het ook gebeuren dat er hier en daar wat pagina's verloren geraakt zijn, gewoon uit slordigheid of door technische tekortkomingen van de scanner.

Om te weten welke pagina's van welke student zijn en om de originele volgorde van de pagina's te kunnen reconstrueren, wordt aan elke pagina een hoofding toegevoegd. Die bestaat uit een unieke code per student, gevolgd door een spatie, een koppelteken, nog een spatie en een paginanummer. Het paginanummer gebruikt het formaat n/m, waarbij n het volgnummer is van de antwoordbladen per student (waarbij de antwoordbladen van elke student vanaf 1 genummerd worden) en m het aantal antwoordbladen is die de student heeft ingediend (het aantal antwoordbladen dat wordt ingediend kan per student verschillend zijn).

hoofding
Elke pagina wordt voorzien van een hoofding met een unieke code voor elke student en een paginanummer.

De unieke code uit de hoofding is de SHA checksum1 die berekend wordt op basis van de naam van de student. Voor student Jayden Randall kan die bijvoorbeeld als volgt berekend worden.

$ shasum <<< "Jayden Randall"
5078225f87bdc04b67ff96406ac2705537898409  -

Opgave

Schrijf een bash shell script feedback waaraan twee argumenten moeten doorgegeven worden: i) de naam van een student (mag spaties bevatten) en ii) een PDF-bestand met een scan van de volledige stapel met alle antwoorden die de studenten op een examen hebben ingediend. Elke pagina is van een hoofding voorzien zoals omschreven in de inleiding. Het shell script moet in de huidige directory een nieuw PDF-bestand studentennaam.pdf genereren met alle pagina's van de gegeven student, in hun originele volgorde (volgens de paginanummering uit de hoofding). Daarbij is studentennaam de naam van de student zoals die aan het shell script werd doorgegeven.

Hiervoor kan het shell script de volgende strategie gebruiken:

  1. splits het gegeven PDF-bestand in PDF-bestanden met de individuele pagina's

  2. bekijk de hoofding van elke individuele pagina om te zien of het om een pagina van de gevraagde student gaat, wat het volgnummer van de pagina is, en wat het totaal aantal pagina's is dat we verwachten

  3. bundel de pagina's van de gevraagde student, in hun originele volgorde, tot één enkel PDF-bestand met de opgegeven naam

Het shell script mag ervan uitgaan dat de argumenten die eraan doorgegeven worden geldig zijn, zonder dat dit expliciet moet gecontroleerd worden.

Als in het gegeven PDF-bestand geen enkele pagina van de gegeven student wordt teruggegeven, dan moet het shell script een gepaste boodschap (zie onderstaande voorbeeldsessie) uitschrijven naar stderr en eindigen met exit status 1 zonder dat er een PDF-bestand voor de student wordt aangemaakt.

Als in het gegeven PDF-bestand één of meer pagina's van de student ontbreken, dan moet voor elke pagina een gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr. In dat geval moet evenwel nog altijd een PDF-bestand met de gevonden pagina's van de student aangemaakt worden.

PDF-bestanden verwerken

Voor het verwerken van PDF-bestanden kan je gebruikmaken van de Linux PDF redering library poppler-utils2. Deze library is beschikbaar op Dodona, maar is free software en kan je ook zelf lokaal installeren indien nodig. De volgende commando's uit de library komen handig van pas voor het implementeren van het shell script uit deze opgave:

  • pdfseparate3: individuele pagina's uit een PDF-bestand extraheren

  • pdfunite4: meerdere PDF-bestanden bundelen tot één enkel PDF-bestand

  • pdftotext5: PDF-bestanden omzetten naar platte tekst

Voorbeeld

Onderstaande voorbeeldsessie geeft aan hoe het shell script feedback moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand antwoorden.pdf6 zich in de huidige directory bevindt.

$ feedback "Tobias Woods" antwoorden.pdf7        # "Tobias Woods.pdf8"
$ feedback "Rogelio Mcdaniel" antwoorden.pdf9    # "Rogelio Mcdaniel.pdf10"
feedback: pagina 2/4 niet gevonden
$ feedback "Mollie Berg" antwoorden.pdf11         # "Mollie Berg.pdf12"
$ feedback "Maverick Dennis" antwoorden.pdf13
feedback: geen pagina's gevonden
$ echo $?
1
$ feedback "Dante Rasmussen" antwoorden.pdf14     # "Dante Rasmussen.pdf15"
feedback: pagina 2/4 niet gevonden
feedback: pagina 3/4 niet gevonden
$ feedback "Adriel Ferguson" antwoorden.pdf16     # "Adriel Ferguson.pdf17"
$ feedback "Irvin Johnston" antwoorden.pdf18      # "Irvin Johnston.pdf19"
feedback: pagina 1/3 niet gevonden