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