da rtf o doc in pdf

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 :smiley: per prenderci la mano.
Avevo giusto fatto una cosa simile :smiley:

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.