- HTMLDOC
- PdfWriter
- PDF::Writer (Austin Ziegler)
- Ruby FPDF
- JasperReports
- PDF Form Fill
- PDFlib and PDFlib-Lite
- Rfpdf
- Ruby/GnomePrint + Ruby/Pango (Unicode)
sudo gem install pdf-writer
successivamente si installa il plugin in questione
ruby script/plugin install svn://rubyforge.org//var/svn/railspdfplugin/railspdf/
Infine basta creare l’azione a cui si vuole associare la generazione del pdf, contenente le variabili con i dati che poi vogliamo pubblicare nella view
... dal controller ...
def getpdf
@rails_pdf_name = "Hello.pdf"
@content = "This is dynamic content!!!"
end
nella directory “view” del controller in questione è necessario creare il file getpdf.rpdf con, per esempio, il seguente contenuto:
pdf.select_font "Times-Roman"
pdf.text @content, :font_size => 72, :justification => :center
Questa soluzione è molto efficace se si vogliono creare pdf semplici in poco tempo, senza grandi esigenze di impaginazione o presentazione dei contenuti. Una guida completa con tutte le funzionalità di pdf-writer si trova qui
Un sistema dalle potenzialità decisamente più ricche e sofisticate è JasperReports. L’integrazione con il framework rails è, tutto sommato, veloce e di facile comprensione. Una guida dettagliata è reperibile qui
Il funzionamento può essere schematizzato come segue:- Si genera un xml contenente i dati che ci interessa trattare nel report
- Viene passato l’xml ad un template JasperReports che, attraverso un’interfaccia java invocata da script, genera il report (nel formato prescelto)
- Viene visualizzato il report (o viene richiesto il suo salvataggio sul pc)
Esiste anche la possibilità di passare i dati in formato xml ad un server che poi si occuperà di generare il pdf. Questo velocizza di molto la procedura poiché non è più necessario richiamare la jvm per ogni generazione. Per maggiori informazioni su JasperServer.
Personalmente ho riscontrato tempi accettabili anche per la soluzione che utilizza la jvm, infatti, nei test fatti, il sistema impiega circa 3 secondi per produrre il pdf.
Gli aspetti che ho trovato più interessanti di questa soluzione, rispetto alla scelta iniziale di PDF::Writer, sono:- Totale separazione tra gestione dei templates e esportazione dei dati che permette un maggior disaccoppiamento tra presentazione grafica e dati
- Grandi potenzialità dello strumento che permette reports con sottoreports, crosstabs e grafici (tramite jfreecharts) ed una gestione del layout di pagina chiara e semplice
- Possibilità di integrazione con strumenti di business intelligence quali JasperAnalysis e JasperETL
- Esistenza di tool grafici per la generazione di templates (iReport, JasperAssistant per Eclipse ...)