Come promesso ecco il codice che avevo realizzato utilizzando
PDFtk per unire una lista di File PDF i cui nomi sono contenuti in una ListBox chiamata
ListFile2:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim I As Integer
Dim F1 As String
Dim F2 As String
Dim F3 As String
Dim RETVAL As String
Dim STRParam As String
ListFile2.SelectedIndex = 0
F1 = Chr(34) & TextPath.Text & "\" & ListFile2.SelectedItem & Chr(34) 'primo file
For I = 1 To ListFile2.Items.Count - 1
ListFile2.SelectedIndex = I
If I > 1 Then
' SeNonEsATT(Chr(34) & TextPath.Text & "\" & "TEMP" & (I - 1) & ".pdf" & Chr(34))
F1 = Chr(34) & TextPath.Text & "\" & "TEMP" & (I - 1) & ".pdf" & Chr(34)
End If
F2 = Chr(34) & TextPath.Text & "\" & ListFile2.SelectedItem & Chr(34) 'secondo file
TextBox2.Text = F2
F3 = Chr(34) & TextPath.Text & "\" & "TEMP" & I & ".pdf" & Chr(34) ' output
TextBox1.Text = F3
'SeNonEsATT(F2)
STRParam = "A=" & F1 & " " & "B=" & F2 & " cat A B output " & F3
RETVAL = Shell("C:\Program Files (x86)\pdftk\bin\pdftk.exe " & STRParam, 0)
Next
CancTemp(I, TextPath.Text)
Attendi()
SeNonEsATT(TextPath.Text & "\" & "TEMP" & (I - 1) & ".pdf")
My.Computer.FileSystem.RenameFile(TextPath.Text & "\" & "TEMP" & (I - 1) & ".pdf", Oggetto.Text & ".pdf")
End Sub
unisco i primi due file di ListFile2 in un file chiamato TEMP che poi a sua volta diventerà il file A dellaSTRParam, poi al secondo ciclo lo diventerà TEMP2 e così via..
anche se poco elegante funziona. il problema è che il carro a volte va d'avanti ai buoi e il codice chiama i file TEMP prima che PDFtk li crei, dando un errore di file non trovato.
allora ho pensato di creare la seguente sub per attendere che il processo PDFtk termini per per rinominare l'ultimo file TEMP(I) che rappresenta l'unione di tutti i file PDF per poi cancellare glia altri e rinominare l'ultimo, ma mi causa lo stesso errore;
Public Sub Attendi()
Do
System.Threading.Thread.Sleep(50)
Loop Until ProcessoAttivo("pdftk") = False
Exit Sub
End Sub
dove processoattivo è questa:
Public Shared Function ProcessoAttivo(ByVal Attivo As String) As Boolean
Dim processo() As Process
processo = Process.GetProcessesByName(Attivo, My.Computer.Name)
If processo.Length > 0 Then
Return True
Else
Return False
End If
End Function
considerato l'insuccesso ho pensato allora di usare File.Exists(FileEs) con il codice che sugue, creando questo ciclo che attende che il file TEMP (I) venga creato evitando che il codice non lo trovi, ma purtroppo va in loop e si blocca:
Public Sub SeNonEsATT(FileEs As String)
While File.Exists(FileEs) = False
System.Threading.Thread.Sleep(500)
End While
End Sub
ecco perchè poi ho chiesto una mano per la libreria Itext che credo sia piuì semplice e possa gestire meglio il problema..
attendo la vostra lavata di testa...ciao ragazzi