Verwenden Sie Libreoffice-Tools anstelle von CLI
Wenn Sie nur Befehlszeilentools haben, sieht alles wie ein Befehlszeilenproblem aus. Ich habe beschlossen, diese Antwort mit LibreOffice-Makros zu schreiben:
- Verwenden Sie eine Befehlszeilenschleife, um jedes Writer-Dokument in einer "kopflosen" Umgebung zu verarbeiten.
- Führen Sie ein Makro aus, um die
.rtf
Writer-Dokumentdatei (Rich Text Format) zu ändern .
- Makro speichert Datei und beendet
- Zurück zu 1.
Testdaten erstellen
Erstellen Sie zwei oder mehr Dateien mit:
Erstelle ein Skript ~/Downloads/copy-rtf.sh
mit:
cp ~/Documents/*.rtf ~/Downloads
Als ausführbar markieren mit
chmod a+x ~/Downloads/copy-rtf.sh
- Während der Entwicklung und des Testens werden die Makrodateien
*.rtf
für das ~/Downloads
Verzeichnis ausgeführt.
- Vor jedem Testtyp
cd ~/Downloads
und Lauf./copy-rtf.sh
- Nachdem die Ausgabe perfekt ist, werden sie zurück in das Live-Verzeichnis kopiert.
Das Downloads-Verzeichnis wird verwendet, weil:
- Jeder hat eine
~/Downloads
- Es wird regelmäßig hinzugefügt und regelmäßig manuell geleert
- Es ist dauerhafter als das
/tmp/
Verzeichnis, das bei einem Neustart möglicherweise nicht erhalten bleibt.
Makro in kopfloser Umgebung ausführen
Mit dieser Stack Exchange-Antwort rufen Sie Libreoffice Writer über die Befehlszeile auf und übergeben ihm einen globalen Makronamen, um Folgendes auszuführen:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
Die obige Antwort funktioniert möglicherweise nicht, so dass eine andere Methode versucht werden kann:
soffice "macro:///Standard.SaveCSV.Main" $1
Installieren Sie Java Runtime Environment
Zum Ausführen von Makros muss Java Runtime Environment (JRE) installiert sein. Auf der Webseite des Entwicklers finden Sie Anweisungen zum manuellen Herunterladen und Installieren.
Diese AU-Fragen und Antworten: /ubuntu//a/728153/307523 legt jedoch nahe, dass dies so einfach ist wie:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Ich habe die AU Q & A-Methode ausprobiert und nach dem ersten Schritt des Hinzufügens des PPA wird ein Begrüßungsbildschirm mit zusätzlichen Informationen angezeigt. Am hilfreichsten ist ein Link zum Einrichten von JRE 8 auf Debian-Systemen .
Für den dritten Schritt der Installation von JRE 8 müssen Sie die Lizenzvereinbarung verwenden Tabund Enterakzeptieren. Ihre Maschine wird während des größten Teils der Installationsroutine für einige Minuten angehalten.
Öffnen Sie nun LibreOffice und wählen Sie Extras -> Optionen -> LibreOffice -> Erweitert und richten Sie diesen Bildschirm ein:
Klicken Sie auf die Optionen für:
- Verwenden Sie eine Java-Laufzeitumgebung
- Oracle Corporation 1.8.0_161
- Makroaufzeichnung aktivieren (experimentell)
- OK klicken
- Sie werden aufgefordert, den Computer neu zu starten. Klicken Sie auf "Jetzt neu starten".
LibreOffice Writer-Makro
Das Makro liest das gesamte Dokument und:
- Ändern Sie den Schriftnamen in Ubuntu.
- Wenn Überschrift 1, setzen Sie die Schriftgröße auf 28
- Andernfalls, wenn die Schriftgröße 18 auf 22 eingestellt ist
- Andernfalls setzen Sie die Schriftgröße auf 12
Das Makro speichert das Dokument und beendet Libreoffice Writer.
Dialog ausschalten
Wenn Sie eine Datei speichern, wird der folgende Dialog angezeigt:
Schalten Sie diese Meldung aus, wie auf dem Bildschirm angezeigt. Das Makro wird möglicherweise nicht ordnungsgemäß ausgeführt, wenn diese Option aktiviert ist.
Makro-Inhalte
Ich habe einige Tage damit verbracht, ein Makro mit "Extras" -> "Makros" -> "Makro aufnehmen" -> "Grundeinstellungen" aufzunehmen. Anfangs schien es vielversprechend, aber das aufgezeichnete Makro zeigte ein inkonsistentes Verhalten und musste für ein handgeschriebenes Grundmakro aufgegeben werden. Eine gefundene Hilfe in Stack Overflow für einen Experten, der mir bei der grundlegenden Codierung hilft . Hier ist das Ergebnis:
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