Use las herramientas de Libreoffice en lugar de la CLI
Cuando todo lo que tiene son herramientas de línea de comando, todo parece un problema de línea de comando. He decidido escribir esta respuesta usando las macros de LibreOffice:
- Utilice un bucle de línea de comando para procesar cada documento de Writer en un entorno "sin cabeza".
- Ejecute la macro para cambiar el
.rtf
archivo de documento del Escritor (Formato de texto enriquecido).
- Macro guarda el archivo y sale
- Vuelve a 1.
Crear datos de prueba
Cree dos o más archivos que contengan:
Crear script que ~/Downloads/copy-rtf.sh
contenga:
cp ~/Documents/*.rtf ~/Downloads
Marcar como ejecutable usando
chmod a+x ~/Downloads/copy-rtf.sh
- Durante el desarrollo y las pruebas, los
*.rtf
archivos de modificación de macros se ejecutarán en el ~/Downloads
directorio.
- Antes de cada tipo de prueba
cd ~/Downloads
y ejecución./copy-rtf.sh
- Una vez que la salida es perfecta, se vuelven a copiar en el directorio en vivo.
El directorio de descargas se usa porque:
- todos tienen un
~/Downloads
- se agrega regularmente y se vacía manualmente periódicamente
- es más permanente que el
/tmp/
directorio que puede no persistir entre reinicios.
Ejecutar macro en un entorno sin cabeza
Usando esta respuesta de Stack Exchange, invoque Libreoffice Writer desde la línea de comando y pásele un nombre de macro global para ejecutar:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
La respuesta anterior puede no funcionar, por lo que se puede probar otro método :
soffice "macro:///Standard.SaveCSV.Main" $1
Instalar Java Runtime Environment
Para ejecutar macros, necesita tener instalado Java Runtime Environment (JRE). La página web del desarrollador tiene instrucciones para descargar e instalar manualmente.
Sin embargo, este AU Q&A: /ubuntu//a/728153/307523 sugiere que es tan simple como:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Probé el método AU Q&A y después del primer paso de agregar el PPA aparece una pantalla de bienvenida con información adicional. Lo más útil es un enlace para configurar JRE 8 en sistemas Debian .
El tercer paso para instalar JRE 8 requiere que use Taby Enteracepte el Acuerdo de licencia. Su máquina se detendrá durante unos minutos durante la parte más pesada de la rutina de instalación.
Ahora abra LibreOffice y seleccione Herramientas -> Opciones -> LibreOffice -> Avanzado y configure esta pantalla:
Haga clic en las opciones para:
- Use un entorno de tiempo de ejecución Java
- Oracle Corporation 1.8.0_161
- Habilitar grabación macro (experimental)
- Haga clic en Aceptar
- Se le pedirá que reinicie, haga clic en "Reiniciar ahora".
LibreOffice Writer Macro
La macro leerá todo el documento y:
- cambie el nombre de la fuente a Ubuntu.
- Si el título 1 establece el tamaño de fuente en 28
- de lo contrario, si el tamaño de fuente es 18 establecido en 22
- de lo contrario, establezca el tamaño de fuente en 12
La macro guardará el documento y saldrá de Libreoffice Writer.
Desactivar el diálogo
Guarde un archivo y aparecerá este cuadro de diálogo:
Apague este mensaje como se muestra en la pantalla. Es posible que la macro no se ejecute correctamente si esta opción está activada.
Contenidos macro
Pasé unos días intentando grabar una macro usando "Herramientas" -> "Macros" -> "Grabar macro" -> "Básico". Al principio parecía prometedor, pero la macro grabada tenía un comportamiento inconsistente y tuvo que ser abandonada por una macro básica escrita a mano. Encontré ayuda en Stack Overflow para un experto que me ayudó con la codificación básica básica . Aquí está el 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