Використовуйте інструменти Libreoffice замість CLI
Коли у вас є інструменти командного рядка, все виглядає як проблема командного рядка. Я вирішив написати цю відповідь за допомогою макросів LibreOffice:
- Використовуйте цикл командного рядка для обробки кожного документа Writer у середовищі "без голови".
- Запустіть макрос, щоб змінити
.rtf
(Rich Text Format) файл документа Writer.
- Макрос зберігає файл та вихід
- Петля назад до 1.
Створення даних тесту
Створіть два або більше файлів, що містять:
Створити сценарій, ~/Downloads/copy-rtf.sh
що містить:
cp ~/Documents/*.rtf ~/Downloads
Позначте як виконуваний за допомогою
chmod a+x ~/Downloads/copy-rtf.sh
- Під час розробки та тестування
*.rtf
файли, що змінюють макроси , працюватимуть проти ~/Downloads
каталогу.
- Перед кожним типом
cd ~/Downloads
і запустіть./copy-rtf.sh
- Після того, як вихід ідеальний, вони копіюються назад у прямий каталог.
Каталог завантажень використовується тому, що:
- у кожного є
~/Downloads
- його додають регулярно та періодично вручну спорожняють
- він є більш постійним, ніж
/tmp/
каталог, який може не зберігатися при перезавантаженнях.
Запустити макрос у безголовому середовищі
За допомогою цього відповіді Stack Exchange виклик Libreoffice Writer з командного рядка та передайте йому загальне ім’я макросу для виконання:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
Наведена вище відповідь може не спрацювати, тому можна спробувати інший метод :
soffice "macro:///Standard.SaveCSV.Main" $1
Встановіть середовище виконання Java
Для запуску макросів вам потрібно встановити Java Runtime Environment (JRE). Веб-сторінка розробника містить інструкції щодо завантаження та встановлення вручну.
Однак це питання AU: /ubuntu//a/728153/307523 передбачає, що це так просто, як:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Я спробував AU Q&A метод, і після першого кроку додавання PPA з'являється екран із сплеском із додатковою інформацією. Найбільш корисним є посилання на налаштування JRE 8 в системах Debian .
Третій крок встановлення JRE 8 вимагає використання Tabта Enterприйняття Ліцензійної угоди. Ваша машина буде робити паузу на кілька хвилин під час найважчої частини встановлення.
Тепер відкрийте LibreOffice та виберіть Інструменти -> Параметри -> LibreOffice -> Додатково та налаштуйте цей екран:
Клацніть параметри для:
- Використовуйте середовище виконання Java
- Корпорація Oracle 1.8.0_161
- Увімкнути макро запис (експериментальний)
- Натисніть кнопку ОК
- Вам буде запропоновано перезапустити, натисніть "Перезапустити зараз".
Макрос LibreOffice Writer
Макрос прочитає весь документ і:
- змінити назву шрифту на Ubuntu.
- Якщо в заголовку 1 встановити розмір шрифту до 28
- в іншому випадку, якщо розмір шрифту 18 встановлений на 22
- інше встановіть розмір шрифту 12
Макрос збереже документ і вийде з програми Libreoffice Writer.
Вимкніть діалогове вікно
Збережіть файл, і з'явиться це діалогове вікно:
Вимкніть це повідомлення як показ на екрані. Макрос може не працювати належним чином, якщо цей параметр увімкнено.
Вміст макросу
Я кілька днів намагався записати макрос, використовуючи "Інструменти" -> "Макроси" -> "Записати макрос" -> "Основні". Спочатку це здавалося багатообіцяючим, але записаний макрос мав непослідовну поведінку і його потрібно було відмовитись від рукописного основного макросу. Знайдена допомога в Stack Overflow для експерта, який допоможе мені провести базове кодування . Ось результат:
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