Sử dụng các công cụ Libreoffice thay vì CLI
Khi tất cả những gì bạn có là các công cụ dòng lệnh, mọi thứ trông giống như một vấn đề dòng lệnh. Tôi đã quyết định viết câu trả lời này bằng cách sử dụng macro LibreScript:
- Sử dụng vòng lặp dòng lệnh để xử lý mọi tài liệu Nhà văn trong môi trường "không đầu".
- Chạy macro để thay đổi
.rtf
tập tin tài liệu Nhà văn (Định dạng văn bản có định dạng).
- Macro lưu tập tin và thoát
- Lặp lại thành 1.
Tạo dữ liệu thử nghiệm
Tạo hai hoặc nhiều tệp chứa:
Tạo tập lệnh ~/Downloads/copy-rtf.sh
chứa:
cp ~/Documents/*.rtf ~/Downloads
Đánh dấu là thực thi bằng cách sử dụng
chmod a+x ~/Downloads/copy-rtf.sh
- Trong quá trình phát triển và thử nghiệm, các
*.rtf
tệp sửa đổi macro sẽ chạy với ~/Downloads
thư mục.
- Trước mỗi loại thử nghiệm
cd ~/Downloads
và chạy./copy-rtf.sh
- Sau khi đầu ra hoàn hảo, chúng được sao chép trở lại vào thư mục trực tiếp.
Thư mục Tải xuống được sử dụng vì:
- mọi người đều có một
~/Downloads
- nó được thêm vào thường xuyên và thủ công làm trống theo định kỳ
- nó là vĩnh viễn hơn
/tmp/
thư mục có thể không tồn tại trên các lần khởi động lại.
Chạy macro trong môi trường không đầu
Sử dụng câu trả lời Stack Exchange này gọi Libreoffice Writer từ dòng lệnh và truyền cho nó một tên macro toàn cầu để thực thi:
soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"
Câu trả lời trên có thể không hoạt động để có thể thử phương pháp khác :
soffice "macro:///Standard.SaveCSV.Main" $1
Cài đặt môi trường chạy thi hành Java
Để chạy macro, bạn cần cài đặt Môi trường chạy thi hành Java (JRE). Trang web của nhà phát triển có hướng dẫn tải xuống và cài đặt thủ công.
Tuy nhiên, Hỏi & Đáp AU này: https://askubfox.com/a/728153/307523 cho thấy nó đơn giản như:
sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default
Tôi đã thử phương pháp Hỏi & Đáp của AU và sau bước đầu tiên thêm PPA, màn hình giật gân xuất hiện với thông tin bổ sung. Hữu ích nhất là liên kết để thiết lập JRE 8 trên các hệ thống Debian .
Bước thứ ba của việc cài đặt JRE 8 yêu cầu bạn sử dụng Tabvà Enterchấp nhận Thỏa thuận cấp phép. Máy của bạn sẽ tạm dừng trong vài phút trong phần nặng nhất của quy trình cài đặt.
Bây giờ hãy mở LibreScript và chọn Công cụ -> Tùy chọn -> LibreOffice -> Nâng cao và thiết lập màn hình này:
Nhấp vào các tùy chọn cho:
- Sử dụng môi trường thời gian chạy Java
- Tập đoàn Oracle 1.8.0_161
- Cho phép ghi macro (thử nghiệm)
- Nhấn vào OK
- Bạn sẽ được yêu cầu khởi động lại, nhấp vào "Khởi động lại ngay".
Trình biên dịch LibreScript
Macro sẽ đọc qua toàn bộ tài liệu và:
- đổi tên phông chữ thành Ubuntu.
- Nếu nhóm 1 đặt kích thước phông chữ thành 28
- khác nếu kích thước phông chữ là 18 được đặt thành 22
- khác đặt kích thước phông chữ thành 12
Macro sẽ lưu tài liệu và thoát khỏi Libreoffice Writer.
Tắt hộp thoại
Thực hiện lưu tệp và hộp thoại này xuất hiện:
Tắt thông báo này như hiển thị trên màn hình. Macro có thể không chạy đúng nếu tùy chọn này được bật.
Nội dung vĩ mô
Tôi đã mất vài ngày để ghi lại một macro bằng cách sử dụng "Công cụ" -> "Macro" -> "Ghi macro" -> "Cơ bản". Lúc đầu, nó có vẻ đầy hứa hẹn nhưng macro được ghi lại có hành vi không nhất quán và phải bị bỏ rơi cho một macro viết tay cơ bản. Một trợ giúp tìm thấy trong Stack Overflow cho một chuyên gia ở đó để giúp tôi với mã hóa cơ bản cơ bản . Đây là kết quả:
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