Chi non ritiene che il formato pdf si sia guadagnato un posto tra gli standard di fatto può anche fermare la sua lettura qui. Scherzi a parte, quanti di noi non si sono mai trovati di fronte all'esigenza di dover stampare sul client qualcosa che somigliasse ad un modulo con una precisa impostazione grafica in cui però variavano, magari perché generati run-time o perché estratti da un database, i valori dei vari campi? Qualche esempio: e se volessi stampare una fattura direttamente sulla stampante del cliente, ma che sia identica al formato grafico utilizzato nel commercio tradizionale? E se volessi stampare l'output di una query eseguita sul mio AS/400 in un formato graficamente gradevole?
Generalmente non si pensa ad Abode Acrobat come ad uno degli strumenti possibili per generare dei report graficamente elaborati, ma in cui i valori dei numeri e delle stringhe di testo provengono dalle sorgenti più disparate: ebbene si sbaglia!
Scopo di questo articolo è mostrarvi come, a partire da un modello consistente in un file .pdf in cui sono stati definiti dei campi (tranquilli, sui client e sul server non vi servirà l'acrobat exchange, la cui necessità è limitata solo alla macchina su cui vine creato il file .pdf da usare poi come modello), è possibile far giungere al client una sua versione completata con i valori desiderati. Unico vincolo è che sul client sia installato e funzionante l'Acrobat Reader. Prima di passare ad un poco di teoria ringrazio Ty Button per un suo articolo illuminante senza il quale non sarei qui a scrivervi.
Salve, mi presento: sono il fomato FDF!
Oltre a saper aprire e trattare i file PDF, l'acrobat reader è programmato per interpretare un altro formato: il Forms Data Format. Senza entrare troppo nello specifico, vi basti sapere che con un file fdf è possibile "poggiare" sopra ad un file PDF campi e bottoni con i relativi valori. In origine il formato era nato per utilizzare acrobat come front-end in applicazioni in cui si voleva che le form in cui inserire i dati fossero graficamente gradevoli, ma non è questo l'utilizzo che se ne farà qui. Noi utilizzeremo le sue capacità di chiamare un pdf (indirizzandolo con una URL) ed assegnare ai vari campi in esso presenti i valori da noi "decisi".
Non mi sto dunque prefiggendo di creare run-time un oggetto pdf (cosa molto più complicata, ma soprattutto determinante un carico considerevole per un server), ma un semplice file di testo che, diretto verso il client e indicato come fdf spingerà il browser ad aprire il plug-in Adobe Acrobat Reader che a sua volta recupererà dal server il .pdf "modello" e ne compilererà i campi come indicato nel fdf.
Risultato: grafica perfetta, carico limitato e soprattutto localizzato prevalentemente sul client, "stampabilità" assoluta. Rimane da risolvere un problemino: come creiamo i file fdf attraverso codice asp?
FDF Toolkit for ActiveX: FdFAcX.dll per gli amici.
La Adobe ha creato un pacchetto sdk per gli fdf davvero notevole. Tra i tanti strumenti e componenti forniti ci sono due dll che sono le uniche cose necessarie sul server NT nel nostro caso: fdfacx.dll e fdftk.dll. Per le versioni più aggiornate, per il ToolKit completo e per l'intera documentazione qui .
Basta con le parole, passiamo ai fatti.
- Registrate le dll sul vostro server (copiatele in una cartella, per esempio c:\winnt\system32\ ed eseguite regsvr32 FdfAcX.dll: verrà in questo modo registrata anche l'altra dll, fdftk.dll)
- Affinché sia possibile inviare direttamente attraverso IIS il formato FDF, come standard output al browser del client, è necessario aggiungere ai tipi MIME conosciuti dal server quello application.vnd.fdf.
In caso contrario il client (nonostante si sia installato correttamente l'adobe acrobat reader) pur leggendo dal buffer il file fdf, ricevendo dal server un'indicazione di tipo MIME sconosciuto proporrà il "Salva con nome?". Per aggiungere il tipo MIME al server è necessario aggiungere un valore ad una chiave di registro.
Se non si hanno ben chiari i rischi di una tale operazione e non si sa procedere al backup del registro, evitate questo punto visto che, come mostrato nel primo esempio, è possibile salvare il file PDF e proporlo in una pagina HTML come link, invece che redirigere direttamente il file fdf sul buffer di IIS.Se invece sapete ciò che state per fare:
- aprite Regedit.exe nella chiave HKEY_LOCAL_MACHINE cercate la chiave SYSTEM\CurrentControlSet\Services\InetInfo\Parameters\MimeMap
- se non esite già la chiave MimeMap e createla
- selezionate la chiave MimeMap ed aggiungetele il valore application/fdf,fdf,,5 (nei menu selezionate Edit->New->String Value e inserite il valore application/fdf,fdf,,5 )
- dopodicchè non vi rimarrà che riavviare il server. Create una pagina di esempio form.asp in cui spingete l'utente ad inserire una serie di dati.
- Aprite sulla macchina in cui avete istallato l'Acrobat Exchange per creare i pdf il file in cui volete che i dati compaiano (se volete importate il documento da una versione cartacea attraverso lo scanner) ed aggiungete i campi che volete con gli strumenti per la definizione delle form. Vedrete che è possibile definire, oltre che il nome del campo, una serie di parametri tra cui quelli che definiscono come i dati devono essere visualizzati (font dimensione etc etc). Annotate i nomi che date ai campi visto che dovrete riferirvi a questi ultimi, oltre che al nome del file pdf, nel codice asp.
OK, ma il codice quando arriva?
Io sto immaginando di ricevere i dati da una form, ma nulla v'impedisce (e ci mancherebbe!) di determinare i valori attraverso una query ad un database o in qualunque altro modo vi faccia comodo. Per non dilungarmi troppo non includo il codice della form con cui invio i dati e non vi descrivo come ho creato il documento pdf con i relativi campi. Potrete scaricare tutti i file necessari per eseguire l'esempio, analizzarli e modificarli come meglio credete, per adesso aguzzate le vostre doti deduttive e leggete i commenti al codice.
Attenzione: Questo articolo contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.