Unire file pdf con pdftk.exe

di il
16 risposte

Unire file pdf con pdftk.exe

Buonasera,
vorrei chiedere un aiuto: ho una tabella/query con n record, quindi con n campi path, come posso utilizzare il comando pdftk facendo in modo che richiami tutti i path della tabella/query e mi restituisca un unico pdf a differenza del codice che posto che richiede due campi specifici F1 e F2.
Grazie in anticipo
Private Sub Comando16_Click()
F1 = "C:\Users\HP\Desktop\A\PRA.pdf"
F2 = "C:\Users\HP\Desktop\A\PRB.pdf"
F3 = "C:\Users\HP\Desktop\A\PRResult.pdf" ' output
strParam = "A=" & F1 & " " & "B=" & F2 & " cat A B output " & F3
RetVal = Shell("C:\Program Files (x86)\pdftk\bin\pdftk.exe " & strParam, 1)
End Sub

16 Risposte

  • Re: Unire file pdf con pdftk.exe

    Dipende anche da quanto può essere al massimo n ...

    Se non è eccessivo, allora puoi creare una sola stringa di parametri da usare con la Shell una sola volta. Altrimenti dovrai utilizzare una strategia un po' più complessa, creando il file di output per parti.

    Comunque, se hai un insieme, supponiamo, di 5 elementi da unire, allora devi creare una stringa fatta così

    "A=primopercorso B=secondopercorso C=terzopercorso C=quartopercorso E=quintopercorso "

    e un'altra stringa con

    "cat A B C D E"

    Poi unisci le due stringhe in una variabile strParam aggiungendo " output fileout.pdf" e la usi nella Shell

    Le prime due stringhe le ottieni con un ciclo for che esplora gli n record e utilizzi la funzione Chr$ per ottenere le lettere A B C ...

    Più facile a farsi che a dirsi
  • Re: Unire file pdf con pdftk.exe

    N potrebbe essere anche 100. Non è possibile impostare una variabile che tiene conto di tutti i record presenti nella query?
  • Re: Unire file pdf con pdftk.exe

    Una variabile? In che senso?

    Devi unire 100 pdf in uno? Che senso ha?
  • Re: Unire file pdf con pdftk.exe

    Mi spiego meglio. Ho una serie di documenti diversi, per ogni documento vi è un record con relativo path. Dopo aver raccolto n documenti ho la necessità di unirli in un unico pdf e renderlo un documento unico. Con una query riesco a mettere in ordine tutti i path, quindi, a questo punto, vorrei richiamare tutti i path e creare il documento pdf unico.
  • Re: Unire file pdf con pdftk.exe

    Nessuno riesce ad aiutarmi? non so proprio come risolvere questo problema
  • Re: Unire file pdf con pdftk.exe

    davide81 ha scritto:


    Nessuno riesce ad aiutarmi? non so proprio come risolvere questo problema
    NOn entro nel merito... ma se hai l'elenco in una Query ed hai capito come unire 2 Documenti... apri un Recordset basato sulla Query, realizzi un Ciclo nei Records e, per ogni iterazione esegui il MERGE del Documento iniziale con quello relativo al Record del Loop...

    P.S. ragiona anche su eventuali Delay dal inserire se non hai reso SINCRONO il processo di MERGE, oppure lo rendi sincrono usando il metodo RUN di Windows Scripting Host che trovi quì:
    https://www.vbsedit.com/html/6f28899c-d653-4555-8a59-49640b0e32ea.asp

    passando il parametro a TRUE per il WAIT.
  • Re: Unire file pdf con pdftk.exe

    Grazie Alex per la tua risposta, ho capito il senso e i passaggi, ma non saprei come scrivere il codice.
  • Re: Unire file pdf con pdftk.exe

    Se vuoi provare a imbastire qualche cosa poi possiamo vedere di aggiustarlo... altrimenti... siamo in difficoltà noi.
    Quì trovi un Tutorial di come si accede ad un Recordset di DATI... prova a ragionarci sopra.
  • Re: Unire file pdf con pdftk.exe

    Ciao Alex,
    ho realizzato un po' di codice, ora il problema è che l'operazione viene eseguita solo sul primo record, sembra non andare avanti...
    Private Sub Comando143_Click()
    Dim db As DAO.Database
    Dim Query1 As DAO.Recordset
    Dim rs As DAO.Recordset
    Dim ConteggioRighe As Integer
    
    'Apertura DB
    Set db = CurrentDb
    
    'Apertura query
    Set Query1 = db.OpenRecordset("Query1", dbOpenDynaset)
    
    'Apertura recodset
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM Query1", dbOpenDynaset)
    rs.MoveLast: rs.MoveFirst
    ConteggioRighe = rs.RecordCount
    
    'Solo per debug poi si cancella
    ConteggioRighe = DCount("*", "[Query1]")
    MsgBox "N. Righe = " & ConteggioRighe
    
    'Mi posiziono sul primo record
    rs.MoveFirst
    'Dichiaro che l'operazione terminerà quando i record sono finiti
    Do Until rs.EOF
    
    ..........qui c'è il codice che mi fa l'operazione sul record..............
    
    
    ' Passo al recordset successivo
    rs.MoveNext
    ' e ricominciamo da DO ad elaborare la successiva riga del recordset fin quando non si arriva al suo termine EOF
    Loop
    MsgBox ("Finito")
    Query1.Close
    End Sub
  • Re: Unire file pdf con pdftk.exe

    Elimina quelle cose assurde che hai scritto e lascia il minimo indispensabile, e metti il codice che dici funzionare solo 1 volta...

    Questo è il codice PULITO, quello che ho tolto è frutto di ERRORI, poi ci guardi:
    
    Private Sub Comando143_Click()
    	Dim db As DAO.Database
    	Dim rs As DAO.Recordset
    	Dim ConteggioRighe As Long
    
    	'Apertura DB
    	Set db = CurrentDb
    
    
    	'Apertura recodset
    	Set rs = CurrentDb.OpenRecordset("SELECT * FROM Query1", dbOpenDynaset)
    	If rs.Bof and rs.eof then
    		Msgbox "VUOTO NON C'E' NULLA"
    		Exit sub
    	End if
    	rs.MoveLast
    	'Mi posiziono sul primo record
    	rs.MoveFirst
    	ConteggioRighe = rs.RecordCount
    	MsgBox "N. Righe = " & ConteggioRighe
    
    	Do Until rs.EOF
    
    		..........qui c'è il codice che mi fa l'operazione sul record..............
    
    
    		' Passo al recordset successivo
    		rs.MoveNext
    	Loop
    	MsgBox ("Finito")
    	rs.Close
    	set rs=nothing
    End Sub
    Ora Scrivi quello che serviva... e che ci hai celato.
  • Re: Unire file pdf con pdftk.exe

    Ciao Alex,
    di seguito il codice completo, con le modifiche da te apportate (grazie).
    Il problema però persiste. Benchè la Query1 contiene 3 records, e in effetti li conta, restituendo il messaggio "3", il codice esegue l'operazione 3 volte sul primo record.
    Il fine è quello di prendere il path di ogni record e salvare il pdf (contenuto nel path) nella cartella origine assegnandogli come nome il numero dell'ID.
    Private Sub Comando143_Click()
    Dim db As DAO.Database
        Dim rs As DAO.Recordset
        Dim ConteggioRighe As Long
    
        'Apertura DB
        Set db = CurrentDb
    
    
        'Apertura recodset
        Set rs = CurrentDb.OpenRecordset("SELECT * FROM Query1", dbOpenDynaset)
        If rs.BOF And rs.EOF Then
            MsgBox "VUOTO NON C'E' NULLA"
            Exit Sub
        End If
        rs.MoveLast
        'Mi posiziono sul primo record
        rs.MoveFirst
        ConteggioRighe = rs.RecordCount
        MsgBox "N. Righe = " & ConteggioRighe
    
        Do Until rs.EOF
    F1 = path
    F3 = "C:\Users\Davide\Desktop\test\origine\" & ID & ".pdf" ' output
    strParam = F1 & " " & "cat output " & F3
    Debug.Print strParam
    retVal = Shell("pdftk " & strParam, 1)
    
    varEnd = DateAdd("s", 2, Now) ' assegnare valore alla pausa
    While DateDiff("s", Now, varEnd) > 0 
    Wend
    
    ' Passo al recordset successivo
            rs.MoveNext
        Loop
        MsgBox ("Finito")
        rs.Close
        Set rs = Nothing
    End Sub
  • Re: Unire file pdf con pdftk.exe

    Nel ciclo non utilizzi i dati del record per effettuare la chiamata alla Shell.
  • Re: Unire file pdf con pdftk.exe

    
    F3 = "C:\Users\Davide\Desktop\test\origine\" & ID & ".pdf" ' output
    
    ID ???
    Magari rs("ID") va meglio ... come già indicato da Oregon
  • Re: Unire file pdf con pdftk.exe

    Grande, funziona perfettamente. Grazie mille.
Devi accedere o registrarti per scrivere nel forum
16 risposte