Usa gli strumenti di Libreoffice invece della CLI
Quando tutto ciò che hai sono strumenti da riga di comando, tutto sembra un problema da riga di comando. Ho deciso di scrivere questa risposta usando le macro di LibreOffice:
- Utilizzare un ciclo da riga di comando per elaborare tutti i documenti di Writer in un ambiente "senza testa".
- Esegui macro per modificare il
.rtf
file del documento Writer (Rich Text Format).
- La macro salva il file ed esce
- Ripeti a 1.
Crea dati di test
Crea due o più file contenenti:
Crea script ~/Downloads/copy-rtf.sh
contenente:
cp ~/Documents/*.rtf ~/Downloads
Segna come eseguibile utilizzando
chmod a+x ~/Downloads/copy-rtf.sh
- Durante lo sviluppo e il test, le macro che modificano i
*.rtf
file verranno eseguite nella ~/Downloads
directory.
- Prima di ogni tipo di test
cd ~/Downloads
ed esecuzione./copy-rtf.sh
- Dopo che l'output è perfetto, vengono copiati nuovamente nella directory live.
La directory Download viene utilizzata perché:
- ognuno ha un
~/Downloads
- viene aggiunto periodicamente e svuotato manualmente periodicamente
- è più permanente della
/tmp/
directory che potrebbe non persistere durante i riavvii.
Esegui macro in ambiente senza testa
Usando questa risposta di Stack Exchange invoca Libreoffice Writer dalla riga di comando e passagli un nome macro globale per eseguire:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
La risposta sopra potrebbe non funzionare, quindi è possibile provare un altro metodo :
soffice "macro:///Standard.SaveCSV.Main" $1
Installa Java Runtime Environment
Per eseguire le macro è necessario che Java Runtime Environment (JRE) sia installato. La pagina web dello sviluppatore contiene istruzioni per il download e l'installazione manuale.
Tuttavia, queste domande e risposte AU: /ubuntu//a/728153/307523 suggeriscono che è semplice come:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Ho provato il metodo di domande e risposte AU e dopo il primo passaggio dell'aggiunta del PPA viene visualizzata una schermata iniziale con ulteriori informazioni. Il più utile è un collegamento alla configurazione di JRE 8 su sistemi Debian .
Il terzo passaggio dell'installazione di JRE 8 richiede l'utilizzo Tabe Enterl'accettazione del Contratto di licenza. La macchina si fermerà per alcuni minuti durante la parte più pesante della routine di installazione.
Ora apri LibreOffice e seleziona Strumenti -> Opzioni -> LibreOffice -> Avanzate e imposta questa schermata:
Fai clic sulle opzioni per:
- Utilizzare un ambiente runtime Java
- Oracle Corporation 1.8.0_161
- Abilita registrazione macro (sperimentale)
- Clicca OK
- Ti verrà chiesto di riavviare, fai clic su "Riavvia ora".
Macro di LibreOffice Writer
La macro leggerà l'intero documento e:
- cambia il nome del carattere in Ubuntu.
- Se l'intestazione 1 imposta la dimensione del carattere su 28
- altrimenti se la dimensione del carattere è 18 impostata su 22
- altrimenti imposta la dimensione del carattere su 12
La macro salverà il documento e uscirà da Libreoffice Writer.
Disattiva la finestra di dialogo
Salva un file e viene visualizzata questa finestra di dialogo:
Disattiva questo messaggio come mostrato sullo schermo. La macro potrebbe non funzionare correttamente se questa opzione è attiva.
Contenuti macro
Ho trascorso alcuni giorni a tentare di registrare una macro utilizzando "Strumenti" -> "Macro" -> "Registra macro" -> "Base". All'inizio sembrava promettente, ma la macro registrata aveva un comportamento incoerente e doveva essere abbandonata per una macro di base scritta a mano. Un aiuto trovato in Stack Overflow per un esperto lì per aiutarmi con la codifica di base di base . Ecco il risultato:
Sub ChangeAllFonts
rem - Change all font names to Ubuntu.
rem - If heading 1 set font size to 28
rem - else if font size is 18 set to 22
rem - else set font size to 12
rem - The macro will save document and exit LibreOffice Writer.
Dim oDoc As Object
Dim oParEnum As Object, oPar As Object, oSecEnum As Object, oSec As Object
Dim oFamilies As Object, oParaStyles As Object, oStyle As Object
oDoc = ThisComponent
oParEnum = oDoc.Text.createEnumeration()
Do While oParEnum.hasMoreElements()
oPar = oParEnum.nextElement()
If oPar.supportsService("com.sun.star.text.Paragraph") Then
oSecEnum = oPar.createEnumeration()
Do While oSecEnum.hasMoreElements()
oSec = oSecEnum.nextElement()
If oSec.TextPortionType = "Text" Then
If oSec.ParaStyleName = "Heading 1" Then
rem ignore for now
ElseIf oSec.CharHeight = 18 Then
oSec.CharHeight = 22.0
Else
oSec.CharHeight = 12.0
End If
End If
Loop
End If
Loop
oFamilies = oDoc.getStyleFamilies()
oParaStyles = oFamilies.getByName("ParagraphStyles")
oStyle = oParaStyles.getByName("Heading 1")
oStyle.setPropertyValue("CharHeight", 28.0)
FileSave
StarDesktop.terminate()
End Sub
rem Above subroutine is missing call to UbuntuFontName ()
rem also it is calling oStyle.setPropertyValue("CharHeight", 28.0)
rem which may cause problems. Will test. Also StarDesktop.terminate ()
rem is known to cause problems and will likely be reworked with a
rem a dialog box telling operator the program is finished and maybe
rem to press <Alt>+<F4>.
rem ========= Original code below for possible recycling ===========
Sub AllFonts
rem - change all font names to Ubuntu.
rem - If heading 1 set font size to 28
rem - else if font size is 18 set to 22
rem - else set font size to 12
rem The macro will save document and exit Libreoffice Writer.
Dim CharHeight As Long, oSel as Object, oTC as Object
Dim CharStyleName As String
Dim oParEnum as Object, oPar as Object, oSecEnum as Object, oSec as Object
Dim oVC as Object, oText As Object
Dim oParSection 'Current Section
oText = ThisComponent.Text
oSel = ThisComponent.CurrentSelection.getByIndex(0) 'get the current selection
oTC = oText.createTextCursorByRange(oSel) ' and span it with a cursor
rem Scan the cursor range for chunks of given text size.
rem (Doesn't work - affects the whole document)
oParEnum = oTC.Text.createEnumeration()
Do While oParEnum.hasMoreElements()
oPar = oParEnum.nextElement()
If oPar.supportsService("com.sun.star.text.Paragraph") Then
oSecEnum = oPar.createEnumeration()
oParSection = oSecEnum.nextElement()
Do While oSecEnum.hasMoreElements()
oSec = oSecEnum.nextElement()
If oSec.TextPortionType = "Text" Then
CharStyleName = oParSection.CharStyleName
CharHeight = oSec.CharHeight
if CharStyleName = "Heading 1" Then
oSec.CharHeight = 28
elseif CharHeight = 18 Then
oSec.CharHeight = 22
else
oSec.CharHeight = 12
End If
End If
Loop
End If
Loop
FileSave
stardesktop.terminate()
End Sub
Sub UbuntuFontName
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------- Select all text ------------------------------------------
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
rem ----------- Change all fonts to Ubuntu -------------------------------
dim args5(4) as new com.sun.star.beans.PropertyValue
args5(0).Name = "CharFontName.StyleName"
args5(0).Value = ""
args5(1).Name = "CharFontName.Pitch"
args5(1).Value = 2
args5(2).Name = "CharFontName.CharSet"
args5(2).Value = -1
args5(3).Name = "CharFontName.Family"
args5(3).Value = 0
args5(4).Name = "CharFontName.FamilyName"
args5(4).Value = "Ubuntu"
dispatcher.executeDispatch(document, ".uno:CharFontName", "", 0, args5())
end sub
sub FileSave
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
end sub