Utilisez les outils Libreoffice au lieu de CLI
Lorsque vous ne disposez que d'outils de ligne de commande, tout ressemble à un problème de ligne de commande. J'ai décidé d'écrire cette réponse en utilisant les macros LibreOffice:
- Utilisez une boucle de ligne de commande pour traiter chaque document Writer dans un environnement "sans tête".
- Exécutez une macro pour modifier le
.rtf
fichier de document Writer (Rich Text Format) Writer.
- La macro enregistre le fichier et quitte
- Retournez à 1.
Créer des données de test
Créez deux fichiers ou plus contenant:
Créer un script ~/Downloads/copy-rtf.sh
contenant:
cp ~/Documents/*.rtf ~/Downloads
Marquer comme exécutable en utilisant
chmod a+x ~/Downloads/copy-rtf.sh
- Pendant le développement et les tests, les
*.rtf
fichiers de modification des macros s'exécuteront dans le ~/Downloads
répertoire.
- Avant chaque type de test
cd ~/Downloads
et exécution./copy-rtf.sh
- Une fois la sortie parfaite, ils sont recopiés dans le répertoire en direct.
Le répertoire Téléchargements est utilisé car:
- tout le monde a un
~/Downloads
- il est ajouté périodiquement et vidé manuellement périodiquement
- il est plus permanent que le
/tmp/
répertoire qui peut ne pas persister lors des redémarrages.
Exécuter une macro dans un environnement sans tête
À l'aide de cette réponse Stack Exchange, appelez Libreoffice Writer à partir de la ligne de commande et passez-lui un nom de macro global à exécuter:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
La réponse ci-dessus peut ne pas fonctionner, donc une autre méthode peut être essayée:
soffice "macro:///Standard.SaveCSV.Main" $1
Installer Java Runtime Environment
Pour exécuter des macros, vous devez installer Java Runtime Environment (JRE). La page Web du développeur contient des instructions pour télécharger et installer manuellement.
Cependant, cette Q&A AU: /ubuntu//a/728153/307523 suggère qu'elle est aussi simple que:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
J'ai essayé la méthode AU Q&A et après la première étape de l'ajout du PPA, un écran de démarrage apparaît avec des informations supplémentaires. Le plus utile est un lien vers la configuration de JRE 8 sur les systèmes Debian .
La troisième étape de l'installation de JRE 8 nécessite que vous utilisiez Tabet Enteracceptiez le contrat de licence. Votre machine s'arrêtera pendant quelques minutes pendant la partie la plus lourde de la routine d'installation.
Maintenant, ouvrez LibreOffice et sélectionnez Outils -> Options -> LibreOffice -> Avancé et configurez cet écran:
Cliquez sur les options pour:
- Utiliser un environnement d'exécution Java
- Oracle Corporation 1.8.0_161
- Activer l'enregistrement macro (expérimental)
- Cliquez sur OK
- Il vous sera demandé de redémarrer, cliquez sur "Redémarrer maintenant".
LibreOffice Writer Macro
La macro lira tout le document et:
- changez le nom de la police en Ubuntu.
- Si l'en-tête 1 définit la taille de police à 28
- sinon si la taille de la police est de 18 réglée sur 22
- sinon définissez la taille de la police sur 12
La macro enregistrera le document et quittera Libreoffice Writer.
Désactiver la boîte de dialogue
Faites un enregistrement de fichier et cette boîte de dialogue apparaît:
Désactivez ce message comme indiqué à l'écran. La macro peut ne pas s'exécuter correctement si cette option est activée.
Contenu de la macro
J'ai passé quelques jours à essayer d'enregistrer une macro en utilisant "Outils" -> "Macros" -> "Enregistrer la macro" -> "Basique". Au début, cela semblait prometteur, mais la macro enregistrée avait un comportement incohérent et a dû être abandonnée pour une macro de base manuscrite. Une aide trouvée dans Stack Overflow pour un expert là-bas pour m'aider avec le codage de base de base . Voici le résultat:
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