Используйте инструменты 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
- После того, как вывод завершен, они копируются обратно в директорию live.
Каталог загрузок используется потому что:
- у каждого есть
~/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 Runtime Environment
Для запуска макросов вам нужно установить 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