Gunakan alat Libreoffice bukan CLI
Ketika semua yang Anda miliki adalah alat baris perintah semuanya tampak seperti masalah baris perintah. Saya telah memutuskan untuk menulis jawaban ini menggunakan makro LibreOffice:
- Gunakan loop baris perintah untuk memproses setiap dokumen Writer dalam lingkungan "tanpa kepala".
- Jalankan makro untuk mengubah
.rtf
(Rich Text Format) file dokumen Writer.
- Makro menyimpan file dan keluar
- Kembali ke 1.
Buat data uji
Buat dua atau lebih file yang mengandung:
Buat skrip yang ~/Downloads/copy-rtf.sh
berisi:
cp ~/Documents/*.rtf ~/Downloads
Tandai sebagai dapat dieksekusi menggunakan
chmod a+x ~/Downloads/copy-rtf.sh
- Selama pengembangan dan pengujian, makro memodifikasi
*.rtf
file akan berjalan melawan ~/Downloads
direktori.
- Sebelum setiap jenis tes
cd ~/Downloads
dan jalankan./copy-rtf.sh
- Setelah output sempurna, mereka disalin kembali ke direktori langsung.
Direktori Unduhan digunakan karena:
- setiap orang memiliki
~/Downloads
- itu akan ditambahkan secara teratur dan dikosongkan secara manual secara berkala
- ini lebih permanen daripada
/tmp/
direktori yang mungkin tidak bertahan selama reboot.
Jalankan makro di lingkungan tanpa kepala
Menggunakan jawaban Stack Exchange ini, minta Libreoffice Writer dari baris perintah dan berikan nama makro global untuk dieksekusi:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
Jawaban di atas mungkin tidak berfungsi sehingga metode lain dapat dicoba:
soffice "macro:///Standard.SaveCSV.Main" $1
Instal Java Runtime Environment
Untuk menjalankan makro Anda perlu menginstal Java Runtime Environment (JRE). Halaman web pengembang memiliki instruksi untuk mengunduh dan menginstal secara manual.
Namun, T&J AU ini: /ubuntu//a/728153/307523 menyarankannya sesederhana:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Saya mencoba metode Tanya Jawab AU dan setelah langkah pertama menambahkan PPA, layar splash muncul dengan informasi tambahan. Yang paling membantu adalah tautan untuk mengatur JRE 8 pada sistem Debian .
Langkah ketiga menginstal JRE 8 mengharuskan Anda untuk menggunakan Tabdan Entermenerima Perjanjian Lisensi. Mesin Anda akan berhenti selama beberapa menit selama bagian terberat dari rutin instalasi.
Sekarang buka LibreOffice dan pilih Alat -> Opsi -> LibreOffice -> Advanced dan setup layar ini:
Klik opsi untuk:
- Gunakan lingkungan Java runtime
- Oracle Corporation 1.8.0_161
- Aktifkan perekaman makro (percobaan)
- Klik OK
- Anda akan diminta untuk me-restart, klik "Restart Now".
LibreOffice Writer Macro
Makro akan membaca seluruh dokumen dan:
- ubah nama font menjadi Ubuntu.
- Jika pos 1 atur ukuran font menjadi 28
- lain jika ukuran font 18 diatur ke 22
- lain atur ukuran font menjadi 12
Makro akan menyimpan dokumen dan keluar dari Libreoffice Writer.
Matikan Dialog
Lakukan penyimpanan file dan dialog ini muncul:
Matikan pesan ini seperti yang ditampilkan di layar. Makro mungkin tidak berjalan dengan benar jika opsi ini aktif.
Konten makro
Saya menghabiskan beberapa hari mencoba merekam makro menggunakan "Alat" -> "Makro" -> "Rekam Makro" -> "Dasar". Pada awalnya itu tampak menjanjikan tetapi makro yang direkam memiliki perilaku yang tidak konsisten dan harus ditinggalkan untuk makro dasar tulisan tangan. Ditemukan bantuan di Stack Overflow untuk ahli di sana untuk membantu saya dengan pengkodean dasar dasar . Inilah hasilnya:
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