Use as ferramentas do Libreoffice em vez da CLI
Quando tudo o que você tem são ferramentas de linha de comando, tudo parece um problema de linha de comando. Decidi escrever esta resposta usando as macros do LibreOffice:
- Use um loop de linha de comando para processar todos os documentos do Writer em um ambiente "sem cabeça".
- Execute a macro para alterar o
.rtf
arquivo de documento do Writer Format (Rich Text Format).
- Macro salva arquivo e sai
- Volta para 1.
Criar dados de teste
Crie dois ou mais arquivos contendo:
Crie um script ~/Downloads/copy-rtf.sh
contendo:
cp ~/Documents/*.rtf ~/Downloads
Marcar como executável usando
chmod a+x ~/Downloads/copy-rtf.sh
- Durante o desenvolvimento e o teste, os
*.rtf
arquivos de modificação de macros serão executados no ~/Downloads
diretório
- Antes de cada tipo de teste
cd ~/Downloads
e execução./copy-rtf.sh
- Depois que a saída é perfeita, eles são copiados de volta para o diretório ativo.
O diretório Downloads é usado porque:
- todo mundo tem um
~/Downloads
- é adicionado ao esvaziado regularmente e manualmente periodicamente
- é mais permanente que o
/tmp/
diretório que pode não persistir durante as reinicializações.
Executar macro em ambiente sem cabeça
Usando esta resposta do Stack Exchange, invoque o Libreoffice Writer na linha de comando e passe um nome de macro global para executar:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
A resposta acima pode não funcionar, então outro método pode ser tentado:
soffice "macro:///Standard.SaveCSV.Main" $1
Instalar o Java Runtime Environment
Para executar macros, você precisa do Java Runtime Environment (JRE) instalado. A página da web do desenvolvedor tem instruções para baixar e instalar manualmente.
No entanto, este Q&A da UA: /ubuntu//a/728153/307523 sugere que é tão simples quanto:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Tentei o método de perguntas e respostas da AU e, após o primeiro passo da adição do PPA, uma tela inicial aparece com informações adicionais. O mais útil é um link para configurar o JRE 8 nos sistemas Debian .
A terceira etapa da instalação do JRE 8 requer que você use Tabe Enteraceite o Contrato de Licença. Sua máquina fará uma pausa por alguns minutos durante a parte mais pesada da rotina de instalação.
Agora abra o LibreOffice e selecione Ferramentas -> Opções -> LibreOffice -> Avançado e configure esta tela:
Clique nas opções para:
- Use um Java Runtime Environment
- Oracle Corporation 1.8.0_161
- Ativar gravação de macro (experimental)
- Clique OK
- Você será solicitado a reiniciar, clique em "Reiniciar agora".
Macro do LibreOffice Writer
A macro lerá todo o documento e:
- mude o nome da fonte para o Ubuntu.
- Se o cabeçalho 1 definir o tamanho da fonte para 28
- caso contrário, se o tamanho da fonte for 18, definido como 22
- caso contrário, defina o tamanho da fonte como 12
A macro salvará o documento e sairá do Libreoffice Writer.
Desativar a caixa de diálogo
Salve o arquivo e essa caixa de diálogo será exibida:
Desative esta mensagem como mostra a tela. A macro pode não funcionar corretamente se esta opção estiver ativada.
Conteúdo da macro
Passei alguns dias tentando gravar uma macro usando "Ferramentas" -> "Macros" -> "Gravar macro" -> "Básico". A princípio, parecia promissor, mas a macro gravada tinha um comportamento inconsistente e teve que ser abandonada para uma macro básica escrita à mão. Uma ajuda encontrada no Stack Overflow para um especialista lá para me ajudar com a codificação básica básica . Aqui está o resultado:
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