mei 082005
 

Het gevaar van elke dag bloggen in plaats van (bijvoorbeeld) één keer per week is dat je twee (#1 en #2) dagen lang ontzettende onzin kunt lopen verkopen voordat je er de derde dag achter komt dat het onzin was. Dat was nu ook het geval. De enige troost is dat het nog niemand anders opgevallen was.
Een van mijn verzuchtingen deze week was:

“Tegen beter weten in heb ik toch nog maar een keer geprobeerd of ik niet toch ook de in Word, Excel, Powerpoint en PDF-documenten aanwezige metadata kon filteren. Gisteren gaf ik al aan dat ik het heel vreemd vond als dat niet met PHP zou kunnen, maar na vandaag moet ik concluderen dat dat waarschijnlijk simpelweg niet kan.”

(bron)

Vandaag zal ik laten zien hoe het met Word, Powerpoint en Excel-bestanden werkt Ãén hoe simpel het uiteindelijk bleek te zijn om metadata uit PDF-bestanden te halen.

Voorbereidingen vooraf
Het script is geschreven in PHP en heeft voor het uit de Office-documenten halen van metadata de beschikking over resp. Word, Powerpoint en Excel nodig. Die programma’s staan meestal niet geïnstalleerd op een webserver en die wil je er eigenlijk ook niet hebben.
Daarom heb ik het script zo geschreven dat je het ook gewoon op een Windows (getest op XP) computer kunt uitvoeren, zonder dat je daarvoor andere dingen hoeft te installeren. Je hoeft dan niet Apache (webserver) of MySQL (database) te installeren of poorten op je computer te openen. Er wordt niets gewijzigd in de registry van Windows, er komen geen bestanden op andere plekken terecht. Je hebt één map met bestanden die je als je dat wilt achteraf in één keer kunt verwijderen.
De eerste stap hieronder (PHP downloaden) hoef je alleen uit te voeren als je nog géén PHP geïnstalleerd hebt staan op de computer waarop je het script wilt gebruiken. Als je dat al hebt kun je bij stap 2) beginnen.

1) PHP downloaden
Het eerste wat je moet doen is PHP downloaden.
Ik heb gewerkt met PHP versie 5.0.4

php downloaden - Klik voor grotere versie

Je moet de link hebben bij “PHP 5.0.4 zip package [7,488Kb] – 31 Mar 2005”, dus niet de installer!
Als je op de link klikt kun je een ‘mirror’ kiezen, de standaardsite is meestal prima. Klik op de link bij de site en sla het zipbestand op op de harde schijf, bijvoorbeeld in D:\PHP_5
Unzip het bestand, mét behoud van de mappenstructuur in de map waarin je hem opgeslagen had. Herbenoem de map dan naar php zodat het php.exe bestand dat er in staat eenvoudiger te bereiken is (als D:\PHP_5\php\php.exe).

2) Script downloaden
Maak nu een map ‘scripts’ aan in de PHP_5 map en sla daar dit scriptbestand (txt 5kB) in op. Herbenoem het bestand naar metadata_office_pdf.php.

We zijn nu klaar met de voorbereidingen.

PHP vanaf de commandoprompt
Normaal gesproken zet je een PHP-script dat je maakt op een webserver, opent dan de browser en voert het adres van het bestand in. Het bestand wordt dan verwerkt/uitgevoerd en het resultaat wordt in de browser getoond.
Je kunt PHP echter ook vanaf de commandoprompt (in een DOS-venster) uitvoeren. Het voordeel is dat je dan geen webserver en browser nodig hebt.

3) Batchbestand voor PHP aanmaken
Maak in de map ‘PHP_5’ een bestand office_metadata.bat aan met daarin de volgende commandoregel:

D:\PHP_5\php\php.exe -n -f D:\PHP_5\scripts\metadata_office_pdf.php %1 > office_PDF_metadata.htm

(dit moet op één regel in het bestand)

Deze commandoregel doet het volgende:
* D:\PHP_5\php\php.exe roept de PHP-interperter aan
* -n geeft aan dat PHP niet moet zoeken naar PHP.ini
* -f geeft aan dat het bestant dat volgt het uit te voeren script is
* %1 wordt in het batchbestand bij het uitvoeren vervangen door de parameter die je meegeeft (de naam van het bestand dat bekeken moet worden)
* > office_PDF_metadata.htm zorgt er voor dat de uitvoer van het batchbestand niet op het scherm getoond wordt, maar opgeslagen wordt in een html-bestand.

4) Uitvoeren van het batchbestand
Start nu in Windows XP een DOS-venster op (Start > Uitvoeren > CMD) en ga naar de plek waar het batchbestand staat. Het batchbestand verwacht één parameter, de naam van het bestand dat bekeken moet worden. Je moet het volledige pad naar het bestand aangeven, bijvoorbeeld:

D:\
PHP_5>office_metadata d:\Office\mijntestbestand.ppt

Waarbij d:\Office\mijntestbestand.ppt het bestand is waar je de metadata uit wilt halen. Er wordt dan een bestand office_PDF_metadata.htm aangemaakt met de metadata die er uit gehaald is.

(vond je dit allemaal wat veel van het goede en heb je dit niet gedaan, dan mag je natuurlijk toch gewoon door lezen)

Metadata uit PDF-documenten
Ik dacht dat ik alles geprobeerd had om met PHP metadata uit een PDF-document te krijgen. Het is ook wel mogelijk met de ‘COM‘-functionaliteit van PHP onder Windows, maar blijkbaar niet zonder dat je de volledige versie van Adobe Acrobat geïnstalleerd hebt staan.

Het blijkt echter dat PDF-bestanden ook ‘gewoon’ met een teksteditor te lezen zijn en dat de metadata daar relatief eenvoudig in terug te vinden is:

PDF metadata in XP - Klik voor grotere versie pdf metadata in teksteditor - Klik voor grotere versie

In de linkerafbeelding zie je de metadata zoals XP die laat zien, aan de rechterkant de inhoud van het PDF-document met ongeveer aan het einde van het bestand de metadata.

Het script opent het PDF document en loopt er regel voor regel doorheen en gebruikt een RegExp om te kijken of het een regel met de metadata is.
Voor de twee datums die in de metadata zitten (Creation Date en Modification Date) zijn in het PDF-formaat duidelijke afspraken vastgelegd, maar omdat van de twee testbestanden die ik had er één zich al niet aan die afspraken hield bevat het script ook een stukje code dat probeert daar zo flexibel mogelijk iets van te maken.

Het resultaat ziet er zo uit:

metadata uit PDF - Klik voor grotere versie metadata uit PDF - Klik voor grotere versie

Metadata uit Office-documenten
Office-documenten zijn ‘binary files’, dat wil zeggen dat als ik ze in bijvoorbeeld notepad open, het er ongeveer zo uitziet:

metadata DOC in tekseditor - Klik voor grotere versie

Nu zal het best mogelijk zijn om erachter te komen hoe je in de brei van codes de metadata rechtstreeks uit het bestand haalt, maar ik had geen tijd om te proberen daar achter te komen.

Daarom heb ik hier wél gebruik gemaakt van de ‘COM‘-functionaliteit van PHP onder Windows. Dat betekent dat ik met PHP op de achtergrond (je ziet ze niet eens verschijnen) het benodigde programma (Word, Excel, Powerpoint) opstart, daar het bestand in open en dan, via de redelijk goed gedocumenteerde mogelijkheden die Office-applicaties hebben om het programma op afstand te besturen, de in het document aanwezige metadata uitlees.

De lijst met mogelijke eigenschappen is erg lang, al zijn ze overigens niet steeds hetzelfde:

metadata uit DOC via COM - Klik voor grotere versie metadata PPT via COM - Klik voor grotere versie metadata uit XLS via COM - Klik voor grotere versie

Ik heb de voorbeelden overigens met opzet niet bewerkt zodat je kunt zien dat de hoeveelheid beschikbare metadata bij een ‘gewoon’ Office-document niet altijd even groot is. Zo heeft het Excel-bestand standaard geen titel, terwijl het Powerpoint-bestand standaard de titel van de eerste dia krijgt (niet echt zinvol). Aanpassen kan echter zowel vanuit het Office-programma zelf, als vanuit Windows XP:

PPT-metadata in XP - Klik voor grotere versie PPT metadata in Powerpoint - Klik voor grotere versie

Je hebt er dus geen aparte/extra programma’s voor nodig én hoeft niet twee aparte bestanden (het Office-document + het metadatabestand) te onderhouden. Ik kan me voorstellen dat je aan een docent/gewone gebruiker kunt vragen om in ieder geval deze informatie in te vullen als dat betekent dat dat dan niet meer hoeft bij het uploaden van het document.

Eerdere berichten:
* deel 1 ging over foto’s;
* deel 2 over video en audio;
* deel 3 ging over Word, Excel, Powerpoint en PDF-documenten;
* deel 4 bekeek een tweetal applicaties voor metadatabeheer in PDF-bestanden.

Deel dit bericht:

  5 reacties aan “Nooit meer metadata invoeren – deel 5”

Reacties (5)
  1. Datgene wat je beschrijft in de sectie ‘PHP downloaden’ is me niet helemaal duidelijk:
    * is dat iets wat alleen werkt bij PHP5?
    * is dat iets waarvoor je (nog een keer apart) PHP voor moet downloaden?
    * wat gebeurt er nou precies in die DOS-regel die je opgeeft?
    * is dit nou een methode die los staat van die twee die je daaronder beschrijft?

  2. Als je wilt gaan experimenteren met het besturen van Office-applicaties vanuit PHP dan kun je het beste beginnen met het schrijven van de applicatie in de Visual Basic editor van Office. Je vindt daar een zeer uitgebreide helpfunctie, allerlei debug-mogelijkheden, alles wat maar nodig en of nuttig kan zijn.
    Als het office-specifieke gedeelte goed werkt is het enige wat je moet doen vanuit PHP een instantie van de office-applicatie te starten waarna je dan de gemaakte VB-code kunt toevoegen.

  3. Hoi Michel,

    Ik heb de tekst proberen aan te passen zodat het duidelijker wordt. Aanvullende antwoorden op jouw vragen:
    * is dat iets wat alleen werkt bij PHP5?
    Nee, PHP via de commandline aanroepen werkt ook bij PHP4. Ik denk haast niet dat ik dingen gebruikt heb in de code die niet met PHP4 werken, maar heb dat niet getest.
    * is dat iets waarvoor je (nog een keer apart) PHP voor moet downloaden?
    Nee, ik heb de tekst aangepast zodat duidelijker is dat dat alleen nodig is als je PHP nog niet geïnstalleerd hebt.
    * wat gebeurt er nou precies in die DOS-regel die je opgeeft?
    Ik hoop dat dat nu duidelijker is.
    * is dit nou een methode die los staat van die twee die je daaronder beschrijft?
    Het eerste deel is de ‘motor’ om het script te laten draaien dat de twee stukken daaronder voor zijn rekening neemt.

    De door jou beschreven oplossing voor het ontwikkelen van de applicatie vind ik handig, maar ik zou er dan wel voor kiezen om de VB-code daarna om te schrijven naar PHP-code in plaats van die VB-code steeds naar de Office-applicatie door te voeren.

  4. Helder.
    Vwb VB vs PHP: dat je alles zoveel mogelijk in één programmeertaal doet is inderdaad wel zo handig. Maar ik kan me herinnereren dat het nogal een uitzoekerij was hoe dat nou zit met die build-in en custom properties. En dan werkt het van te voren uittesten in de VB-programmeeromgeving wel prettig

  5. @Michel: klopt helemaal, had me waarschijnlijk wel wat tijd gescheeld.

Sorry, het reactieformulier is momenteel gesloten.