Afbeeldingen gebruiken in CFDOCUMENT

09-05-2012 | Marcel van Langen | ColdFusion | afbeelding, http, request, cfdocument

CFDOCUMENT is een krachtige ColdFusion tag om met name PDF bestanden mee te genereren. Een paar dagen geleden verzocht een klant me om een afbeelding op te laten nemen in het PDF bestand. In eerste instantie dacht ik aan het simpelweg gebruiken van de IMG tag en dat werkte lokaal prima. In productie werden ze verrassend genoeg niet getoond. Tijd voor een onderzoek.

Probleem is dat ColdFusion bij het opvragen van een afbeelding via de IMG tag gebruik maakt van HTTP. En in sommige gevallen is de server niet in staat om met HTTP de betreffende afbeelding op te halen. Denk bijvoorbeeld aan het gebruik van het HTTPS protocol of een tussenliggende firewall die dit onmogelijk maakt. Gelukkig is er een alternatief.

Je kunt ColdFusion namelijk vertellen dat hij de afbeelding niet op moet halen via HTTP, maar gewoon via het filesysteem. Voorwaarde is dan natuurlijk wel dat je server via het filesysteem bij het betreffende bestand moet kunnen. Wil je deze manier inzetten, dan heb je wat extra code nodig om dit mogelijk te maken. We laten het hieronder stap voor stap zien.

Om dit mogelijk te maken gaan we een nieuwe functie maken. We noemen deze bijvoorbeeld HTTPtoLocalFile. Maar je kunt hieraan je eigen naam geven. Deze functie geven we een mooie plaats in een component, maar als je wilt kun je er ook een UDF van maken. Wat je prettig vindt werken. Deze functie bevat de volgende code:

<cffunction name="HTTPtoLocalFile">
<cfargument name="file" type="string" />
<cfset var fpath = ExpandPath(file)>
<cfset var f="">
<cfset f = createObject("java", "java.io.File")>
<cfset f.init(fpath)>
<cfreturn f.().toString()>
</cffunction>

Kort gezegd doet deze functie het volgende: de functie ontvangt als argument de naam van een bestand, eventueel aangevuld met een (relatief) pad. De functie zet dit om naar een absoluut pad op de server, en zorgt ervoor dat de afbeelding goed binnen de CFDOCUMENT tags wordt opgenomen. Maar hoe roepen we deze functie dan aan? Om dit toe te lichten vind je hieronder voorbeeldcode. De business case is het genereren van een dagrapportage voor een cliënt. In het rapport van de cliënt willen we de pasfoto van de cliënt zelf opnemen. De code ziet er dan ongeveer als volgt uit:

<cfheader name="Content-Disposition" value="attachment; filename=dagrapportage_#qryClientItem.ccl_naam_opgemaakt#.pdf" />
<cfdocument format="PDF" margintop="0.1" pagetype="A4" orientation="portrait">
<cfoutput>
<img src="#HTTPtoLocalFile("#application.PadPasfotosRelatief##qryClientItem.ccl_pasfoto#")#" />
</cfoutput>
</cfdocument>

Voila, opgelost! Let er wel op dat deze functie juist weer niet werkt als je geen CFDOCUMENT gebruikt. Zou je de CFHEADER en CFDOCUMENT tags verwijderen uit dit verhaal (waardoor de gegevens op het scherm worden getoond), dan zou je de afbeelding niet zien.

Over Morloff

Morloff ontwerpt en realiseert succesvolle webtoepassingen op het gebied van procesoptimalisatie, eCommerce en rapportage door de inzet van moderne webtechnieken, sociale media en zoekmachine optimalisatie.

over ons | diensten | portfolio | contact | route

naar website IJsmonster.nl naar website ICT intermediairs naar website marcelvanlangen.com

Twitter

Morloff

Cuneraweg 169a
3911 RH Rhenen

M +31 (0)6 - 515 96 189
W www.morloff.nl
E contactformulier

Morloff op Twitter Morloff op Facebook Morloff op LinkedIn Morloff via RSS