In che modo possibile puntare via codice ad un file doc o rtf e trasformarlo e salvarlo in pdf ?
Con LibreOffice installato ho fatto questa ricerca:
https://ask.libreoffice.org/en/question/12084/how-to-convert-documents-to-pdf-on-osx/
Ho provato con una shell (uso Mac):
Dim s As New Shell,cmd as string
cmd = “cd /Applications/LibreOffice.app/Contents/MacOS ./soffice --headless --convert-to pdf /Users/lismax/Desktop/MioFile.rtf”
s.Execute(cmd)
oppure
cmd =“env cd /Applications/LibreOffice.app/Contents/MacOS”
s.Execute(cmd)
cmd =“env ./soffice --headless --convert-to pdf /Users/lismax/Desktop/MioFile.rtf”
s.Execute(cmd)
ma non esegue (errore 127)
Qualche suggerimento ?
C’ qualche errore nella shell ?
Non ho LibreOffice installato ma ad occhio direi che il comando dovrebbe essere:
cmd="/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf "+folderItemDaConvertire.ShellPath
(occhio allo spazio dopo pdf)
Grazie ma nessun risultato anche se la shell non genera errori.
Provo anche con Win cambiando i percorsi.
Il comando questo:
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf:writer_pdf_Export --outdir {DIR} {FILE}
Ho fatto anche un form di esempio:
Il codice semplice.
// convert
log_area.Text = “”
Dim out_dir As String
Dim selected_file As String
Dim s As New Shell
Dim cmd as string
out_dir = txt_dir_chose.Text
selected_file = txt_file_chose.Text
cmd = "/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf:writer_pdf_Export --outdir "
cmd = cmd + out_dir + " " + selected_file
log_area.Text = "executing: " + EndOfLine
log_area.Text = log_area.Text + cmd + EndOfLine
s.Execute(cmd)
log_area.Text = log_area.Text + "result: " + EndOfLine
log_area.Text = log_area.Text + s.Result + EndOfLine
// select file:
Dim dlg As OpenDialog
Dim f As FolderItem
dlg = New OpenDialog
#If Not TargetLinux Then
dlg.InitialDirectory = SpecialFolder.Documents
#Else
dlg.InitialDirectory = SpecialFolder.Home
#Endif
dlg.Title = “Select a DOC/RTF file”
dlg.Filter = FTYPES.doc + “;” + FTYPES.rtf
f = dlg.ShowModal
If f <> Nil Then
txt_file_chose.Text = f.ShellPath
Else
MsgBox(“Please select a document to convert”)
End If
// select directory
Dim dlg As New SelectFolderDialog
dlg.ActionButtonCaption = “Select”
dlg.Title = “Title Property”
dlg.PromptText = “Prompt Text”
#If Not TargetLinux Then
dlg.InitialDirectory = SpecialFolder.Documents
#Else
dlg.InitialDirectory = SpecialFolder.Home
#Endif
Dim f As FolderItem
f = dlg.ShowModal
If f <> Nil Then
txt_dir_chose.Text = f.ShellPath
Else
MsgBox(“Please select directory”)
End If
Il progetto sta qua:
http://micheg.altervista.org/xojo/fileconvert.xojo_binary_project.zip
Perfetto.
Grazie
Figurati, venerd mi sono letto il manualetto in Italiano, anzi ringrazio Antonio per la traduzione.
Io sono uno sviluppatore python / php / js con diversi anni di esperienza anche su cordova e desktop con electron.
Alcuni anni fa (molti) avevo usato il realbasic 5.5 (al tempo clonava l’interfaccia del VB6), mi venuta voglia per un progettino di riprenderlo e sono due giorni che faccio piccole utility e simili per prenderci la mano.
Avevo giusto fatto una cosa simile
Saluti, ci ribecchiamo sul forum.
Ancora una domanda.
Ho provato a farlo funzionare sotto windows con il seguente risultato:
executing:
C:\Program Files (x86)\LibreOffice 5\program\soffice --headless --convert-to pdf:writer_pdf_Export --outdir C:\Users\Utente\Desktop C:\Users\Utente\MioDoc.doc
result:
“C:\Program” non riconosciuto come comando interno o esterno,
un programma eseguibile o un file batch.
Eppure se lancio da riga di comando Window
C:\Program Files (x86)\LibreOffice 5\program\soffice
mi apre regolarmente soffice
Non riesco a risolvere il problema
Devi indicare il percorso di windows racchiudendolo tra doppi apici ed indicando anche l’estensione .exe, altrimenti hai problemi quando i percorsi contengono spazi.
Farei cos
dim dq as string = chr(34)
cmd = dq + "C:\\Program Files (x86)\\LibreOffice 5\\program\\soffice.exe" + dq + " --convert-to pdf:writer_pdf_Export --outdir " + dq + "C:\\Users\\Utente\\Desktop C:\\Users\\Utente\\MioDoc.doc" + dq
s.Execute(cmd)
Ho provato ma cmd viene cos interpretato
“C:\Program Files (x86)\LibreOffice 5\program\soffice.exe” --convert-to pdf:writer_pdf_Export --outdir “C:\Users\Utente\Desktop C:\Users\Utente\MioDoc.doc”
e non viene eseguito
Cos dovrebbe andare:
dim dq as string = chr(34)
cmd = dq + "C:\\Program Files (x86)\\LibreOffice 5\\program\\soffice.exe" + dq + " --convert-to pdf:writer_pdf_Export --outdir " + dq + "C:\\Users\\Utente\\Desktop" + qd + " " + dq + C:\\Users\\Utente\\MioDoc.doc" + dq
s.Execute(cmd)
anzi cos
dim dq as string = chr(34)
cmd = dq + "C:\\Program Files (x86)\\LibreOffice 5\\program\\soffice.exe" + dq + " --convert-to pdf:writer_pdf_Export --outdir " + dq + "C:\\Users\\Utente\\Desktop" + qd + " " + dq + "C:\\Users\\Utente\\MioDoc.doc" + dq
s.Execute(cmd)
Ok Pietro grazie testato e funziona.
Mi resta un ultimo problema.
Mentre con MacOS la stringa di puntamento sempre la stessa:
/Applications/LibreOffice.app/Contents/MacOS/soffice
con Windows cambia a seconda della versione di LibreOffice
C:\Program Files (x86)\LibreOffice 5\program\soffice.exe
Qualche idea ?
Ti ho fatto una funzione che reperisce soffice.exe e te lo restituisce come folderitem.
Cerca sia su sistemi 32bit che 64bit; se non trova soffice.exe, restituisce Nil.
Public Function getSofficeWin() as FolderItem
if not TargetWindows then Return nil
dim dq as String = chr(34)
dim programFiles() as String = array("C:\\Program Files (x86)","C:\\Program Files")
dim soffice as FolderItem
dim cmd as String
dim shellResult as String
dim s as New Shell
s.Mode=0
For each path as String in programFiles
cmd = "where /r " + dq + path + dq + " soffice.exe"
s.Execute(cmd)
shellResult = NthField(s.ReadAll, EndOfLine, 1)
try
soffice = GetFolderItem(shellResult, FolderItem.PathTypeNative)
Catch err as RunTimeException
Continue
end try
if soffice<>Nil Then
if soffice.Exists then
if not soffice.Directory then Return soffice
end If
End If
next
End Function
Molto interessante ma al secondo ciclo For each path as String in programFiles
where /r “C:\Program Files (x86)” soffice.exe
mi restituisce nil
Il primo ciclo cerca su sistemi a 32 bit
where /r "C:\\Program Files (x86)" soffice.exe
Se trova il file soffice.exe, dovrebbe restituirti il folderitem corrispondente e non fare il secondo ciclo.
Il secondo ciclo cerca su sistemi a 64 bit
where /r "C:\\Program Files" soffice.exe
[quote=379633:@Massimo Lista]Molto interessante ma al secondo ciclo For each path as String in programFiles
where /r “C:\Program Files (x86)” soffice.exe
mi restituisce nil[/quote]
Quando parli del secondo ciclo, dovrebbe fare
where /r "C:\\Program Files" soffice.exe
e non
where /r "C:\\Program Files (x86)" soffice.exe
come dici tu, quindi non mi è chiaro il tuo post.
La funzione ti ritorna il folderitem corretto oppure no?
Il valore della Folderitem restituita dalla funzione Nil
Dopo il primo next i valori sono:
ShellResult = Shell timed out
soffice.NativePath = Nil
Al secondo For
ShellResult = INFORMAZIONI: impossibile trovare file corrispondenti ai
soffice,NativePath = come sopra
ProgramFiles = String(1)= 0 C\Program Files(x86) 1 C\Program Files
Ok. Ora un po’ pi chiaro.
Probabilmente sul pc dove gira, ci sono molti programmi installati in “C:\Program Files”, quindi il timeout di default di 2 secondi della shell, arriva prima che la shell abbia esplorato tutta la cartella “C:\Program Files”.
Proviamo a disattivare il timeout e vediamo cosa succede; dopo la riga in cui viene dichiarato il modo della shell, aggiungi la disattivazione del timeout, ottenendo un codice come il seguente.
dim s as New Shell
s.Mode=0
s.TimeOut=-1
Ovviamente, dovrai attendere pazientemente che la shell termini.
OK ora funziona alla grande. Solo 4 secondi di attesa.
Grazie Pietro.