Compilare Form PDF

Cerco un metodo per compilare un pdf (compilabile).
Ho provato diversi plugin per l’emissione di pdf fino a trovarne uno con i relativi sorgenti porting o clone di ‘fpdf’.
Dopo vari aggiustamenti per emettere il pdf come 1/A, salvarlo su file temporaneo piuttosto che eseguire il launch dopo averlo creato, oppure allegarlo ad un email che sar inoltrata via FTP ho realizzato che utilizzare questo plugin per l’emissione di DDT o FATTURE o comunque moduli commerciali una cosa che non mi va. Non tanto per riuscire o non riuscire a realizzare l’operazione… Ma perch volevo lasciare all’utente finale la possibilit di personalizzare loghi, scritte, formati etc.
Quindi detto questo mi venuta l’idea di ‘compilare’ moduli PDF gi pronti.

Non ho un idea di come strutturato un PDF classico come per un PDF in formato modulo, quindi chiedo se avete un’idea ve ne sarei grato…

NB: per chi non ha voglia di sbattersi troppo ho creato un containercontrol per la generazione di codici a barre EAN 13 / EAN 8 se a qualcuno serve io sono qui.

Puoi provare con PDFlib

http://www.pdflib.com/download/pdflib-family/pdflib-9/
http://www.pdflib.it

Ti ringrazio molto.
Ma l’applicazione che sto creando ( un software di contabilit ) non dovr contenere nessun componente di terze parti con licenza per tenere i costi pi bassi possibile.
Dovr acquistare XOJO e per farlo sicuramente occorrer andare a chiedere l’elemosina per strada.

[quote=59753:@Massimiliano Chiodi]… Non tanto per riuscire o non riuscire a realizzare l’operazione… Ma perchè volevo lasciare all’utente finale la possibilità di personalizzare loghi, scritte, formati etc…
Quindi detto questo mi è venuta l’idea di ‘compilare’ moduli PDF già pronti…[/quote]

Ciao Massimiliano,

Si consiglia di provare il componente PDF DBReport, ma il pagamento del PDF è gratuito. Se interessati, posso tradurlo in italiano.

A proposito di moduli PDF DynaPDF è un prodotto eccellente.

Ti crei la stampa e poi usi un device PDF se sei su win (ce ne sono gratis), su mac lo fai da sistema !
Io faccio cos e non spendo nulla !

Per l’emissione dei documenti utilizzo una libreria compatibile con FPDF .
Io volevo solo compilare dei moduli o form pdf che sono gi pronti. (o comunque che sono gi in grado di creare).

Io ho risolto il problema utilizzando PDFToolKit (gratuito)
In sostanza con la sintassi “pdftk form.pdf fill_form data.fdf output out.pdf flatten” generi “out.pdf” che il risultato di “form.pdf” compilato con i dati presenti in “data.fdf”.
Ti crei un modello.pdf ed un modello.fdf e poi da shell lanci pdftk e crei il tuo pdf compilato.

Questa la funzione che ho fatto e che dovrai adattare allo scopo, ma in sostanza a questa passi:
Il modello pdf
Il modello fdf
Un dictionary che contiene l’elenco dei valori
ed il nome del file da generare

[code]Function CompilaPDF(ModelloPDF as FolderItem, ModelloFDF as FolderItem, ElencoValori as Dictionary, NomePdfCompilato as String) As FolderItem
if Uppercase(NomePdfCompilato.Right(4))=“.PDF” Then NomePdfCompilato = Mid(NomePdfCompilato, 1, NomePdfCompilato.Len-4)

Dim RigheModelloFdf() as String
Dim FileFDF as FolderItem
Dim PdfFinale as FolderItem
Dim StreamOutput as TextOutputStream
Dim row as String
Dim i as Integer
Dim PdfTK as FolderItem
PdfTK = Root.Child(“PDFtk”).Child(“bin”).Child(“pdftk.exe”)
Dim DA as String
DA = chr(34)
Dim CodiceUnico as String

Dim Comando as String
Dim s as New Shell
s.Mode = 0

RigheModelloFdf = CaricaModelloFdf(ModelloFDF)

//Inserisco i valori di ElencoValori nell’array RigheModelloFdf
For i=0 to RigheModelloFdf.Ubound

row = RigheModelloFdf(i)
For Each Key as Variant in ElencoValori.Keys
  if row = "/T ("+Key+")" Then
    RigheModelloFdf(i-1) = "/V ("+ElencoValori.Value(Key)+")"
    Exit
  End If
Next

Next

CodiceUnico = Timestamp

//Genero il file FDF per la compilazione del ModelloPDF
Root.Child(“tmp”).Child(CodiceUnico).CreateAsFolder
FileFDF = Root.Child(“tmp”).Child(CodiceUnico).Child(NomePdfCompilato+“.fdf”)
StreamOutput=TextOutputStream.Append(FileFDF)

For Each Row in RigheModelloFdf
StreamOutput.WriteLine ConvertEncoding(row, Encodings.ISOLatin1)
Next

StreamOutput.Close

PdfFinale = Root.Child(“tmp”).Child(CodiceUnico).Child(NomePdfCompilato+“.pdf”)

'pdftk form.pdf fill_form data.fdf output out.pdf flatten
Comando = _
DA + PdfTK.ShellPath + DA + " " +_
DA + ModelloPDF.ShellPath + DA +_
" fill_form " +_
DA + FileFDF.ShellPath + DA +_
" output " + _
DA + PdfFinale.ShellPath + DA +_
" flatten"
s.Execute(Comando)

FileFDF.Delete

Return PdfFinale
End Function
[/code]

Il modello fdf lo generi sempre con pdftk, con il comando:

pdftk example.pdf generate_fdf output out.fdf

Ti genera un file di testo simile a questo

[code]%FDF-1.2
%
1 0 obj
<<
/FDF
<<
/Fields [
<<
/V ()
/T (ASLPAZTel)

<<
/V ()
/T (ASLPAZDataNascita)

<<
/V ()
/T (ASLPAZEntePrescrittore)

<<
/V ()
/T (ASLPAZTesseraSanitaria)

<<
/V ()
/T (ASLPAZUnitaOperativa)

<<
/V ()
/T (ASLPAZPaziente)

<<
/V /
/T (OSSLUNO2SenzaPortatile)

<<
/V /
/T (OSSLUNO2ConPortatile)

<<
/V ()
/T (ASLPAZSesso)

<<
/V ()
/T (IPOINTSaturazioneDaSforzo)

<<
/V ()
/T (ASLPAZCausale)

<<
/V ()
/T (IPOINTSaturazioneNotturna)

<<
/V ()
/T (ASLPAZDataInizioOssigenoTerapia)

<<
/V ()
/T (ASLPAZCodiceAsl)

<<
/V ()
/T (IPOCONPaCO2ConSupplementoO2)

<<
/V ()
/T (IPOCONPaO2InAria)

<<
/V ()
/T (OSSLUNFlussoARiposo)

<<
/V ()
/T (OSSLUNFlussoNotturno)

<<
/V /
/T (OSSLUNConcentratore)

<<
/V ()
/T (IPOCONPaO2ConSupplementoO2)

<<
/V ()
/T (ASLPAZResidenza)

<<
/V ()
/T (IPOCONPaCO2InAria)

<<
/V ()
/T (OSSLUNTotaleOre)

<<
/V /
/T (OSSLUNBombole)

<<
/V ()
/T (OSSLUNFlussoSottoSforzo)

<<
/V ()
/T (ASLPAZCodiceFiscale)

<<
/V /
/T (OSSLUNVentiMeccDomiciliareSI)

<<
/V ()
/T (UnitaOperativaPrescrittrice)

<<
/V ()
/T (DIABASDiagnosi)

<<
/V ()
/T (DIABASAltro)

<<
/V ()
/T (ASLPAZDataCompilazione)

<<
/V /
/T (OSSLUNVentiMeccDomiciliareNO)

]

endobj
trailer

<<
/Root 1 0 R

%%EOF
[/code]

Per indicare nell’fdf i valori per i campi userai una sintassi tipo questa:

[code]Per i campi testo
<</T(NomeCampo)/V(Valore)>>

Per i checkbox
<</T(NomeCampo)/V(Yes)>>
<</T(NomeCampo)/V(Off)>>
[/code]

Quindi il dictionary da passare alla funzione lo creerai con:
Dict.Value(NomeCampo)=Valore

Pietro

Si prega di provare il nostro MBS DynaPDF Plugin.
https://www.monkeybreadsoftware.de/xojo/plugin-dynapdf.shtml

Io avevo risolto con fpdf con un jpg b/n come sfondo (il modulo compilato) e il risultato soddisfacente, inoltre funziona su tutte le piattaforme senza dll o librerie esterne (previa disattivazione della compressione zlib).

Per una fattura di 10 pagine genera un file di 300 kbyte … mi pare pi che soddisfacente.

[quote=66594:@Massimiliano Chiodi]Io avevo risolto con fpdf con un jpg b/n come sfondo (il modulo compilato) e il risultato è soddisfacente, inoltre funziona su tutte le piattaforme senza dll o librerie esterne (previa disattivazione della compressione zlib).

Per una fattura di 10 pagine genera un file di 300 kbyte … mi pare più che soddisfacente.[/quote]

Che intendi per previa disattivazione della compressione zlib??

con MBS Plugin:
SetCompressionLevel(0) <- nessuna compressione
o
SetCompressionLevel(9) <- massimo compresssion

con DynaPDF

nel modulo gcompression commenta la riga con return zlibCompress(s) e aggiungi return s come nell’esempio.
cos disattivi la compressione zlib che non funzionerebbe su tutte le piattaforme

  // Heres goes the gzip compression algoritm or plugin call
  'return zlibCompress(s)
  Return s

Grazie MIlle :wink:

Ciao Ragazzi, mi riaggancio a questo Post.

Anche io come consigliato dal buon Massimiliano Chiodi utilizzo le librieri FPDF per generare dei file PDF. Mi sono accorto per che queste librerie non funzionano su Windows 10.

Avete riscontrato anche voi questo problema?

Grazie