Gisteren heb ik in de Mac Terminal de Python package zplgrf, waarmee je ZPL-bestanden kunt converteren naar afbeeldingen, werkend gekregen. Vandaag was de uitdaging om dit ook werkend te krijgen in Laravel. Om dit te testen heb ik een lokaal Laravel-project opgezet in Docker en daarin Python geïnstalleerd. Vervolgens heb ik een apart Python-script in mijn Laravel-map geplaatst en een uploadcontroller gemaakt die het Python-script uitvoert. Hiervoor heb ik gebruikgemaakt van composer/process, een Composer-package die het mogelijk maakt om commando’s vanuit je applicatie uit te voeren, zoals het uitvoeren van een Python-script.
Daarna moest ik nadenken over hoe ik het Python-script zou afhandelen, aangezien de gegenereerde PDF niet lokaal gedownload moest worden, maar in de browser moest worden getoond. De werkwijze was als volgt: het ZPL-bestand wordt eerst naar het Python-script gestuurd, dat het bestand naar een PDF converteert. Vervolgens wordt de gegenereerde PDF teruggestuurd naar de controller om in de browser weer te geven. Dit heb ik gedaan door ->setInput($fileContent) te gebruiken, wat een manier is om de inhoud van een bestand (in dit geval $fileContent) door te geven aan het Python-script. In het script haal ik dit bestand op via file_content = sys.stdin.read(), wat de inhoud van het bestand inleest.
Om de PDF vervolgens tijdelijk op te slaan, zodat de controller het later kan ophalen, heb ik gebruikgemaakt van io.BytesIO(). Dit is als het ware een tijdelijke opslag in het geheugen. Dit is handig omdat ik het bestand niet op de schijf hoef op te slaan, maar in het geheugen kan houden totdat het nodig is.
Hoe het werkt, is dat de functie het bestand in het geheugen opslaat. Wanneer je data naar deze buffer schrijft, komt de cursor (de positie van waaruit gelezen of geschreven wordt) aan het einde van het bestand te staan. Dat betekent dat als je meteen probeert te lezen, de cursor aan het einde staat en er niets gelezen kan worden. Om de inhoud van het bestand te kunnen lezen, moet je de cursor eerst terugzetten naar het begin van de buffer. Dit doe ik met bestand.seek(0). Dit zet de cursor aan het begin van de buffer, zodat het programma de gehele content leest.
Tot slot heb ik sys.stdout.buffer.write() gebruikt om de inhoud van de buffer naar de output te sturen. De controller kan deze vervolgens ophalen en de PDF in de browser tonen.
Ook heb ik geleerd wat indexes in een database. Indexes zijn gestructureerde hulpmiddelen die het mogelijk maken om sneller gegevens op te halen, vergelijkbaar met een inhoudsopgave in een boek. Ze helpen de database om snel de relevante records te vinden zonder de hele tabel door te zoeken.
