Użyj narzędzi Libreoffice zamiast CLI
Gdy wszystko, co masz, to narzędzia wiersza polecenia, wszystko wygląda jak problem z wierszem poleceń. Postanowiłem napisać tę odpowiedź za pomocą makr LibreOffice:
- Użyj pętli wiersza poleceń, aby przetworzyć każdy dokument Writer w środowisku „bezgłowym”.
- Uruchom makro, aby zmienić
.rtf
plik dokumentu Writer (Rich Text Format).
- Makro zapisuje plik i kończy działanie
- Powróć do 1.
Utwórz dane testowe
Utwórz dwa lub więcej plików zawierających:
Utwórz skrypt ~/Downloads/copy-rtf.sh
zawierający:
cp ~/Documents/*.rtf ~/Downloads
Oznacz jako wykonywalny za pomocą
chmod a+x ~/Downloads/copy-rtf.sh
- Podczas programowania i testowania
*.rtf
pliki modyfikujące makra będą działały w ~/Downloads
katalogu.
- Przed każdym typem testu
cd ~/Downloads
i uruchom./copy-rtf.sh
- Po uzyskaniu idealnego wyniku są one kopiowane z powrotem do katalogu na żywo.
Katalog Pobrane jest używany, ponieważ:
- każdy ma
~/Downloads
- jest dodawany do regularnie i okresowo ręcznie opróżniany
- jest bardziej trwały niż
/tmp/
katalog, który może nie utrzymywać się po ponownym uruchomieniu.
Uruchom makro w środowisku bezgłowym
Korzystając z odpowiedzi Stack Exchange, wywołaj Libreoffice Writer z wiersza poleceń i przekaż mu globalną nazwę makra, aby wykonać:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
Powyższa odpowiedź może nie działać, więc można wypróbować inną metodę :
soffice "macro:///Standard.SaveCSV.Main" $1
Zainstaluj środowisko Java Runtime Environment
Aby uruchomić makra, musisz zainstalować środowisko Java Runtime Environment (JRE). Strona internetowa programisty zawiera instrukcje dotyczące ręcznego pobierania i instalowania.
Jednak te pytania i odpowiedzi dotyczące AU: /ubuntu//a/728153/307523 sugerują, że jest to tak proste, jak:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Wypróbowałem metodę AU Q&A i po pierwszym kroku dodawania PPA pojawia się ekran powitalny z dodatkowymi informacjami. Najbardziej pomocny jest link do konfiguracji JRE 8 w systemach Debian .
Trzeci krok instalacji środowiska JRE 8 wymaga użycia Tabi Enterzaakceptowania umowy licencyjnej. Podczas najcięższej części procedury instalacji urządzenie zatrzyma się na kilka minut.
Teraz otwórz LibreOffice i wybierz Narzędzia -> Opcje -> LibreOffice -> Zaawansowane i skonfiguruj ten ekran:
Kliknij opcje dla:
- Użyj środowiska wykonawczego Java
- Oracle Corporation 1.8.0_161
- Włącz rejestrowanie makr (eksperymentalne)
- Kliknij OK
- Zostaniesz poproszony o ponowne uruchomienie, kliknij „Uruchom ponownie teraz”.
LibreOffice Writer Macro
Makro przeczyta cały dokument i:
- zmień nazwę czcionki na Ubuntu.
- Jeśli nagłówek 1 ustaw rozmiar czcionki na 28
- w przeciwnym razie, jeśli rozmiar czcionki to 18, ustaw 22
- w innym przypadku ustaw rozmiar czcionki na 12
Makro zapisze dokument i zamknie Libreoffice Writer.
Wyłącz okno dialogowe
Wykonaj zapis pliku, a pojawi się następujące okno dialogowe:
Wyłącz tę wiadomość, jak pokazuje na ekranie. Makro może nie działać poprawnie, jeśli ta opcja jest włączona.
Zawartość makr
Spędziłem kilka dni próbując nagrać makro za pomocą „Narzędzia” -> „Makra” -> „Nagraj makro” -> „Podstawowy”. Na początku wydawało się to obiecujące, ale zarejestrowane makro nie zachowywało się niekonsekwentnie i musiało zostać porzucone, aby napisać ręcznie makro podstawowe. Znaleziona pomoc w przepełnieniu stosu dla eksperta, który pomoże mi w podstawowym podstawowym kodowaniu . Oto wynik:
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