https://www.iprogrammatori.it/forum-programmazione/access/access-stampa-unione-pdf-editabile-t21273.html
Peccato che il link nell'altro post non funzioni più
Sono io l'autore di quel post e penso di ricordare a cosa mi riferivo. Non sono certo che il link sia l'equivalente di quello del 2014 ma la sostanza è quella.
http://accessmvp.com/thedbguy/demos/fillablepdf.php
Occhio, crea il pdf e lo popola con i dati contenuti nel file xfdf ma per la creazione del pdf si limita ad aprire il file xfdf con l'applicazione predefinita, in quel momento si perde ogni controllo sulla procedura, perché non viene avviato ad esempio un'istanza di Adobe Reader tramite codice. O se si può io non lo so fare.
Integro con qualche informazione in più e nozioni acquisite nel frattempo.
La struttura del file xfdf è più o meno questa
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/"
xml:space="preserve">
<f href="nomemodello.pdf"/>
<fields>
<field name="nomecampo1">
<value>Valore Campo 1</value>
</field>
<field name="nomecampo2">
<value>Valore Campo 2</value>
</field>
<field name="nomecampo3notes">
<value>Valore campo 3</value>
</field>
...
</fields>
</xfdf>
Trattandosi di un testo banale non serve passare da MSXML ma è sufficente la creazione del file con Open e Print, nativi VBA.
Per generare F24 a raffica ho aggirato l'ostacolo unendo i vari file xfdf (creati sullo stile del codice presente dei demo di theDBguy) usando PDFtk. La prima fase, la più ingarbugliata, è quella di creare i vari file xfdf formalmente corretti, ognuno dei quali prende i dati dal database. Per ottenere poi il risultato che volevo era sufficiente una riga comandi, un file bat o vbs che ripeteva a raffica l'operazione di “unione”. L'attribuzione del nome al file pdf in quest'ultima fase avveniva prendendo il nome del file xfdf che era stato costruito ad hoc.
Per capirci, per creare 3 file pdf da modello.pdf contenente campi compilabili, tramite vba ho creato 3 file xfdf chiamati Tizio.xfdf, Caio.xfdf e Sempronio.xfdf. Poi con la riga comandi o vbs mettevo in azione pdftoolkit che creava un pdf da ogni xfdf con lo stesso nome del file xfdf. Ecco quindi che si otteneva Tizio.pdf, Caio.pdf e Sempronio.pdf
Ho scartabellato nelle directory e “vi vendo” i file come li avevo fatti a suo tempo, quando sapevo poco ma veramente poco.
File bat
rem se lo si usa in bat bisogna mettere due volte il segno di percentuale, mi sembra
for %%I in (*.xfdf) do pdftk F24_editabile.pdf fillform "%%I" output "%%~nI.pdf" flatten
Il file VBS invece era questo
Option Explicit
dim objFso
dim objFolder
Dim objFile
dim nomefile
Set objFso = CreateObject("Shell.Application")
Set objFolder = objFso.Namespace("C:\Percorso\FileXPDF")
Dim wshell
set wshell = CreateObject("Wscript.shell")
For each objFile in ObjFolder.Items
If Right(objFile.Name, len(objFile.Name) - inStrRev(objfile.Name, ".")) = "xfdf" Then
nomefile = objFile.Name
dim rigacomando
rigacomando = "pdftk.exe F24_editabile.pdf fill_form " & chr(34) & nomefile & chr(34) & " output "
rigacomando = rigacomando & chr(34) & "PDF\" & Left(objFile.Name, inStrRev(objfile.Name, ".")-1)
rigacomando = rigacomando & ".pdf" & chr(34)
wshell.run rigacomando, 7, true
End If
Next
set wshell = Nothing
Set objFso = Nothing
Set objFolder = nothing
Set objfile = Nothing
Non so perché non l'ho fatto da VBA, non me lo ricordo, forse il bat / vbs era di immediato utilizzo senza ulteriore approfondimento. Poi non ho avuto più la necessità di riprenderlo in mano, quindi è praticamente fermo al 2015 circa, solo adesso vedrei bene aggiungere “flatten” alla stringa rigacomando (salvo non voler lasciare nei pdf i campi leggibili).
rigacomando = rigacomando & ".pdf flatten" & chr(34)
Nella cartella di lavoro deve essere presente una sottocartella \PDF dove salvare i PDF (solo per non averli mescolati con gli xfdf). Lo so, il codice può crearla se non la trova ma nel 2015 non lo sapevo fare.
PDFtk non ha la versione portable, quindi bisogna installarlo e poi fare riferimento al percorso in cui si trovano pdftk.exe e libiconv2.dll
Per comodità li copiavo dove erano i file xfdf per non dover impostare altre directory nella riga comandi, già era complicato per me creare quella cosa.
Ora è chiaro perché Adobe Acrobat si paga e fa tutto da VBA mentre per usare strumenti gratuiti si deve fare tutto sto lavoro?
05/09/2023 - @Alex ha scritto:
Non sarebbe meglio generare il PDF da un Report o da un Template di Word…?
Andare ad editare un PDF, cosa ovviamente fattibile, richiede a prescindere Librerie esterne come ADOBE WRITER,
Concordo al 1000%, anche se può essere un po' brigoso costruire il modello F24 e tutti i campetti su Word o nel report.
come PDFCreator ad esempio:
https://sourceforge.net/projects/pdfcreator/
Questo componente si istanzia come una DLL nel progetto quindi istruzioni alla mano vai ad aprire il Documento in PDF e punti ai Controlli Editabili di cui parli e di cui devi sapere il Nome…
oh, se qualcuno ci riesce con PdfCreator (che sia la versione 1.7.2 o una di quelle recenti, 5.x) lo scriva in grande qui perché cerco questa cosa da sempre.
(ecco servito il pippone, dice qualcuno)