ใช้เครื่องมือ Libreoffice แทน CLI
เมื่อสิ่งที่คุณมีเครื่องมือบรรทัดคำสั่งทุกอย่างดูเหมือนว่าปัญหาบรรทัดคำสั่ง ฉันตัดสินใจที่จะเขียนคำตอบนี้โดยใช้มาโคร LibreOffice:
- ใช้วนบรรทัดคำสั่งเพื่อประมวลผลทุกเอกสาร Writer ในสภาพแวดล้อม "หัวขาด"
- เรียกใช้แมโครเพื่อเปลี่ยน
.rtf
ไฟล์เอกสาร Writer (Format Rich)
- แมโครบันทึกไฟล์และออก
- วนกลับเป็น 1
สร้างข้อมูลทดสอบ
สร้างสองไฟล์ขึ้นไปที่มี:
สร้างสคริปต์~/Downloads/copy-rtf.sh
ที่มี:
cp ~/Documents/*.rtf ~/Downloads
ทำเครื่องหมายว่าใช้งานได้โดยใช้
chmod a+x ~/Downloads/copy-rtf.sh
- ในระหว่างการพัฒนาและทดสอบแมโครที่แก้ไข
*.rtf
ไฟล์จะทำงานกับ~/Downloads
ไดเรกทอรี
- ก่อนการทดสอบแต่ละประเภท
cd ~/Downloads
และเรียกใช้./copy-rtf.sh
- หลังจากเอาต์พุตสมบูรณ์แบบจะถูกคัดลอกกลับไปยังไดเร็กทอรีสด
ไดเร็กทอรีดาวน์โหลดถูกใช้เนื่องจาก:
- ทุกคนมี
~/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 และหลังจากขั้นตอนแรกของการเพิ่ม PPA หน้าจอเริ่มต้นจะปรากฏขึ้นพร้อมข้อมูลเพิ่มเติม เป็นประโยชน์มากที่สุดคือการเชื่อมโยงไปยังการตั้งค่า JRE 8 ในระบบ
ขั้นตอนที่สามของการติดตั้ง JRE 8 กำหนดให้คุณใช้TabและEnterยอมรับข้อตกลงสิทธิ์ใช้งาน เครื่องของคุณจะหยุดชั่วครู่หนึ่งในระหว่างช่วงการติดตั้งที่หนักที่สุด
ตอนนี้เปิด LibreOffice และเลือกเครื่องมือ -> ตัวเลือก -> LibreOffice -> ขั้นสูงและตั้งค่าหน้าจอนี้:
คลิกตัวเลือกสำหรับ:
- ใช้สภาพแวดล้อมรันไทม์ของ Java
- Oracle Corporation 1.8.0_161
- เปิดใช้งานการบันทึกมาโคร (ทดลอง)
- คลิกตกลง
- คุณจะถูกขอให้รีสตาร์ทคลิก "รีสตาร์ททันที"
มาโคร LibreOffice Writer
แมโครจะอ่านเอกสารทั้งหมดและ:
- เปลี่ยนชื่อแบบอักษรเป็น Ubuntu
- หากหัวเรื่อง 1 ตั้งค่าขนาดตัวอักษรเป็น 28
- อื่นถ้าขนาดฟอนต์เท่ากับ 18 ให้เป็น 22
- ตั้งค่าขนาดตัวอักษรเป็น 12
แมโครจะบันทึกเอกสารและออกจาก Libreoffice Writer
ปิดกล่องโต้ตอบ
ทำการบันทึกไฟล์และกล่องโต้ตอบนี้เกิดขึ้น:
ปิดข้อความนี้ตามที่แสดงในหน้าจอ แมโครอาจทำงานไม่ถูกต้องหากเปิดใช้ตัวเลือกนี้
เนื้อหามาโคร
ฉันใช้เวลาสองสามวันในการพยายามบันทึกมาโครโดยใช้ "เครื่องมือ" -> "มาโคร" -> "บันทึกมาโคร" -> "พื้นฐาน" ในตอนแรกดูเหมือนว่าจะมีแนวโน้ม แต่แมโครที่บันทึกไว้มีพฤติกรรมที่ไม่สอดคล้องกันและต้องถูกทิ้งไว้สำหรับแมโครพื้นฐานที่เขียนด้วยมือ วิธีใช้ที่พบในกองมากเกินสำหรับผู้เชี่ยวชาญที่นั่นเพื่อช่วยฉันด้วยพื้นฐานการเขียนโปรแกรมขั้นพื้นฐาน นี่คือผลลัพธ์:
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