martedì, ottobre 09, 2007

Convertire documenti di Microsoft Office in PDF tramite la riga di comando

Oggi mi sono definitivamente ed ufficialmente rotto i cojoni.

Sono stufo ed arcistufo di trovare gente che si ostina ad utilizzare gli orrendi formati proprietari di Microsoft Office per divulgare documenti et similia. Mi riferisco in particolare ad alcuni docenti che non riescono a capire che le slides sarebbe meglio distribuirle in formato PDF piuttosto che in quel cesso di PPT.

Quante volte desidero studiare al PC con un sistema leggero e minimale, un semplice Fluxbox come WM e xpdf per leggere i PDF. E invece no! Devo caricare quel bisonte di OpenOffice per poter leggere le slides o gli esercizi (questi ultimi il più delle volte in formato DOC). Poi, già che ci sono, mi metto lì e, non avendo un cazzo da fare, butto nel cesso il poco tempo prezioso che ho per esportare in PDF tutti i files, uno per uno.

Alchè oggi ho detto "basta!!!".

Ho quindi stilato, dopo qualche breve ricerca su Google, una mini-guida che spiega come convertire qualsiasi documento di Microsoft Office in PDF usando semplicemente la riga di comando. Prima di tutto, è necessario avere OpenOffice installato sul proprio sistema, poichè il tutto si baserà sull'uso di una macro creata appositamente per lo scopo.

Per prima cosa, lanciare il binario generico di OpenOffice con:

$ ooffice

Quindi, per creare una nuova macro, cliccare rispettivamente su Tools ---> Macros ---> Organize Macros ---> OpenOffice.org Basic come riportato in figura:


Cliccare poi su My Macros, Standard e quindi sul pulsante New come in figura:


A questo punto, cancellare il testo che potrebbe essere presente nell'editor di testo e copiare il seguente codice (in
Visual Basic, bleeeaaah!!!):

Sub DocumentToPDF(strFile as string)
Dim oDoc as Object
Dim strFilterSubName as String

strUrl = ConvertToUrl( strFile )
oDoc = StarDesktop.loadComponentFromURL( strUrl, "_blank", 0, array(MakePropertyValue("Hidden",true)))

If not IsNull(oDoc) Then
strFilterSubName = ""
' select appropriate filter
If oDoc.SupportsService("com.sun.star.presentation.PresentationDocument") Then
strFilterSubName = "impress_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then
strFilterSubName = "calc_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.text.WebDocument") Then
strFilterSubName = "writer_web_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.text.GlobalDocument") Then
strFilterSubName = "writer_globaldocument_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.text.TextDocument") Then
strFilterSubName = "writer_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.drawing.DrawingDocument") Then
strFilterSubName = "draw_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.formula.FormulaProperties") Then
strFilterSubName = "math_pdf_Export"
ElseIf oDoc.SupportsService("com.sun.star.chart.ChartDocument") Then
strFilterSubName = "chart_pdf_Export"
Else
'
EndIf
EndIf

If Len(strFilterSubName) > 0 Then
oDoc.storeToUrl( ConvertToUrl( strFile & ".pdf" ), array(MakePropertyValue("FilterName", strFilterSubName ),MakePropertyValue("CompressMode", "1" )))
EndIf

oDoc.close(True)
End Sub

Function MakePropertyValue( Optional cName As String, Optional uValue ) As com.sun.star.beans.PropertyValue
oPropertyValue = createUnoStruct( "com.sun.star.beans.PropertyValue" )

If Not IsMissing( cName ) Then
oPropertyValue.Name = cName
EndIf

If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue
EndIf

MakePropertyValue() = oPropertyValue
End Function

Qui un piccolo screenshot:


Fatto ciò, salvare e chiudere OpenOffice.

Ok, ora arriva la parte più interessante.
Se siete in una directory in cui avete un mix letale di files PPT, DOC, XLS, ecc..., vi basta il semplice e comodo comando seguente per convertire tutti i suddetti files direttamente in PDF, senza dovervi neanche preoccupare di esplicitare il formato di origine (ci pensa la macro a rilevarlo):

$ for i in `ls *`; do ooffice "macro:///Standard.Module1.DocumentToPDF(`pwd`/$i)"; done

Naturalmente, ora ci si può sbizzarrire a fare script di ogni genere e sorta in base alle proprie necessità. Inoltre, per il comando sopra riportato non è necessario l'uso di X, perciò si possono convertire i files tranquillamente in modalità solo testuale.

Cià! :-D

12 commenti:

desy ha detto...

meno male che non lavori uomo... alla fine usano tutti la suite di office e la gente nemmeno sa che esiste open office, figurarsi il resto!
E pensare che per quello che lo usano andrebbe benissimo OO e anzi, farebbe risparmiare alla nostra regione, nonchè stato, nonchè TU ed IO singoli cittadini molti quattrini che invece mandiamo direttamente in america così possono comprarsi armi sempre + fighe con cui andare a rubare nelle altre nazioni... scusate il cinismo, mi è scappata ;)

Anonimo ha detto...

In questi casi dovresti chiedere ai professori in questione di mettere delle slide in un formato aperto, anche perchè credo siano tenuti a farlo.

Bones McCoy ha detto...

ciao andrea,
ho installato OO su una maccchia senza server X, quindi creo la macro in un file di testo.
Come faccio a registrarla e dove devo mettere il file della macro?!

d1s4st3r ha detto...

Guarda, il codice della macro va scritto dentro al seguente file:

~/.openoffice.org2/user/basic/Standard/Module1.xba

Presta solo la dovuta attenzione poichè tutti i files di configurazione di OOo sono in XML.

Piuttosto, ti consiglio di seguire passo passo la guida su una macchina con server X, e poi copiare i files in questione sulla tua.

Se avrete ancora un po' di pazienza, sto ultimando uno shell script che dovrebbe fare tutto da solo. Ma non so ancora quando lo rilascerò (il tempo è un maledetto tiranno).

d1s4st3r ha detto...

Come promesso poco tempo fa, ho ultimato e pubblicato la prima versione dello script in grado sia di installare da solo la macro per OpenOffice che di convertire un insieme di files di Microsoft Office direttamente in PDF.
Lo trovate qui:

http://barberaware.org/snippet/detail.php?type=snippet&id=8

Have fun!!!

Anonimo ha detto...

se dovessi fare questa operazione da visual basic 6 che cosa devo cambiare al codice. Un Grazie anticipato a chi mi risponde
pubblisirio@libero.it

Anonimo ha detto...

Hi there, of course this post is truly pleasant and I have learned lot of things from
it regarding blogging. thanks.

my webpage cleaning services chicago
My web page :: housekeep

Anonimo ha detto...

Hmm it looks like your site ate my first comment (it was extremely long) so
I guess I'll just sum it up what I submitted and say, I'm thoroughly
enjoying your blog. I as well am an aspiring blog writer but I'm still new to everything. Do you have any suggestions for novice blog writers? I'd really appreciate it.

hardwood floors

my weblog hardwood floor
my site > hardwood floors installation

Anonimo ha detto...

I have been surfing online more than 4 hours today,
yet I never found any interesting article like yours.
It's pretty worth enough for me. Personally, if all webmasters and bloggers made good content as you did, the internet will be much more useful than ever before.

Feel free to visit my blog ... cls222.kostanye.ru
My web site - http://openrpg.wrathof.com/faq1/Hair_Loss_Treatments_For_Men

Anonimo ha detto...

I do believe all the ideas you've presented in your post. They're really
convincing and can definitely work. Nonetheless, the posts are too brief for starters.

Could you please lengthen them a little from next time?
Thanks for the post.

my weblog: cleaning companies

Anonimo ha detto...

Sweet blog! I found it while searching on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?
I've been trying for a while but I never seem to get there! Appreciate it
zezima

Also visit my web-site :: pinfile-C:\Unindexed\unindexed.txt%

Anonimo ha detto...

You're so awesome! I do not suppose I have read something like this before. So good to discover somebody with a few genuine thoughts on this issue. Seriously.. thanks for starting this up. This web site is one thing that's needed on
the web, someone with some originality!
back massager

Here is my blog ambien