เปลี่ยนเอกสาร LibreOffice อย่างน้อย 2 เอกสารเพื่อให้มีสไตล์ / การจัดรูปแบบเหมือนกันทุกประการ


14

ว่าฉันมีไดเรกทอรีที่มี.rtfไฟล์ประมาณ 100 ไฟล์ที่ฉันแก้ไขด้วย LibreOffice Writer

ฉันหวังว่าไฟล์ทั้งหมดในไดเรกทอรีนั้นจะมีคำสั่งสไตล์ริชเท็กซ์พื้นฐานเหมือนกันตัวอย่างเช่น:

* font-family: Ubuntu             # All text in all files is now Ubuntu;
* font-size: 12px                 # All text in all files is now 12px big;
h1: 28px                          # All h1's are now 28px big;
if font-size: 18px {make it 22px} # All text with font-size 18px is now 22px;

และอื่น ๆ ... ดังนั้นโดยทั่วไปฉันต้องการเปลี่ยนไฟล์ทั้งหมดในครั้งเดียว เป็นไปได้ "จัดแต่งทรงผมเป็นกลุ่ม" เป็นไปได้?

อาจเป็นไปได้ด้วย CLI หรือไม่


3
นี่ไม่ใช่งานง่าย ๆ ที่ฉันคิด หากสิ่งเหล่านี้มีโครงสร้างแบบเดียวกันคุณอาจใช้โซลูชันแฮ็คที่มีการแทนที่ข้อความในไฟล์. rtf จากบรรทัดคำสั่ง อย่างไรก็ตามสิ่งนี้ขึ้นอยู่กับว่าไฟล์ rtf มีลักษณะอย่างไรและมีความคล้ายคลึงกันอย่างไร
เซบาสเตียนสตา

ฉันพบความช่วยเหลือใน Stack Overflow สำหรับมาโคร LibreOffice Writer ใหม่ทั้งหมดโดยเริ่มจากศูนย์คืนนี้ เราไม่จำเป็นต้องรู้ขนาดตัวอักษรที่เป็นไปได้อีกต่อไป
WinEunuuchs2Unix

ในความพยายามครั้งสุดท้ายฉันขอให้ผู้เชี่ยวชาญ Stack Overflow โพสต์คำตอบที่นี่ก่อนช่วงเวลาผ่อนผันจะสิ้นสุดลง: stackoverflow.com/questions/49640951//
WinEunuuchs2Unix

พวกคุณมีคะแนนชื่อเสียงนับหมื่น ฉันขอแนะนำให้คุณพิจารณาให้อย่างเช่น 500-750 เพียงแค่การพิจารณา แค่เพียง.
JohnDoea

คำตอบ:


5

ใช้เครื่องมือ Libreoffice แทน CLI

เมื่อสิ่งที่คุณมีเครื่องมือบรรทัดคำสั่งทุกอย่างดูเหมือนว่าปัญหาบรรทัดคำสั่ง ฉันตัดสินใจที่จะเขียนคำตอบนี้โดยใช้มาโคร LibreOffice:

  1. ใช้วนบรรทัดคำสั่งเพื่อประมวลผลทุกเอกสาร Writer ในสภาพแวดล้อม "หัวขาด"
  2. เรียกใช้แมโครเพื่อเปลี่ยน.rtfไฟล์เอกสาร Writer (Format Rich)
  3. แมโครบันทึกไฟล์และออก
  4. วนกลับเป็น 1

สร้างข้อมูลทดสอบ

สร้างสองไฟล์ขึ้นไปที่มี:

richtext2.png

สร้างสคริปต์~/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 -> ขั้นสูงและตั้งค่าหน้าจอนี้:

Lo JRE8 Advanced Setup.png

คลิกตัวเลือกสำหรับ:

  • ใช้สภาพแวดล้อมรันไทม์ของ Java
  • Oracle Corporation 1.8.0_161
  • เปิดใช้งานการบันทึกมาโคร (ทดลอง)
  • คลิกตกลง
  • คุณจะถูกขอให้รีสตาร์ทคลิก "รีสตาร์ททันที"

มาโคร LibreOffice Writer

แมโครจะอ่านเอกสารทั้งหมดและ:

  • เปลี่ยนชื่อแบบอักษรเป็น Ubuntu
  • หากหัวเรื่อง 1 ตั้งค่าขนาดตัวอักษรเป็น 28
  • อื่นถ้าขนาดฟอนต์เท่ากับ 18 ให้เป็น 22
  • ตั้งค่าขนาดตัวอักษรเป็น 12

แมโครจะบันทึกเอกสารและออกจาก Libreoffice Writer

ปิดกล่องโต้ตอบ

ทำการบันทึกไฟล์และกล่องโต้ตอบนี้เกิดขึ้น:

LO Writer ปิด RTF dialog.png

ปิดข้อความนี้ตามที่แสดงในหน้าจอ แมโครอาจทำงานไม่ถูกต้องหากเปิดใช้ตัวเลือกนี้

เนื้อหามาโคร

ฉันใช้เวลาสองสามวันในการพยายามบันทึกมาโครโดยใช้ "เครื่องมือ" -> "มาโคร" -> "บันทึกมาโคร" -> "พื้นฐาน" ในตอนแรกดูเหมือนว่าจะมีแนวโน้ม แต่แมโครที่บันทึกไว้มีพฤติกรรมที่ไม่สอดคล้องกันและต้องถูกทิ้งไว้สำหรับแมโครพื้นฐานที่เขียนด้วยมือ วิธีใช้ที่พบในกองมากเกินสำหรับผู้เชี่ยวชาญที่นั่นเพื่อช่วยฉันด้วยพื้นฐานการเขียนโปรแกรมขั้นพื้นฐาน นี่คือผลลัพธ์:

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

2

นี่เป็นวิธีการหนึ่งในการใช้ Libre Office มันไม่ได้เป็นชุด แต่อาจช่วยสร้างแรงบันดาลใจคำตอบอื่น ๆ

เปิดไฟล์ rtf ที่มีแบบอักษร Ubuntu, H1 ที่ 28 pt, ข้อความ 12pt และบางส่วนที่ 18 pt

นี่คือตัวอย่าง:

ทดสอบ rtf

ขั้นตอนต่อไปนี้จะใช้การเปลี่ยนแปลงที่ร้องขอในคำถามของคุณ "ถ้าขนาดตัวอักษร: 18px {ทำให้เป็น 22px} # ข้อความทั้งหมดที่มีขนาดตัวอักษร 18px คือ 22px;"

คลิกแก้ไข→ค้นหาและแทนที่บนเมนูหรือกดCtrlHตัวเลือกอื่น ๆ คลิกค้นหาสำหรับกล่องแล้วปุ่มขนาดตัวอักษรกล่องกาเครื่องหมายจากนั้นเลือกรูปแบบปุ่มเลือก 18 pt จากกล่องเลื่อนด้านขวาสุดคลิกแทนที่ด้วยกล่องแล้วปุ่มจัดรูปแบบและเลือก 22 pt จาก กล่องเลื่อนด้านขวาสุด

FindNreplace

คลิกแทนที่ทั้งหมด

บรรทัดที่เกี่ยวข้องที่เปลี่ยนแปลงคือ:

\ par \ pard \ plain \ s0 \ ql \ widctlpar \ hyphpar0 \ ltrpar \ cf1 \ kerning1 \ dbch \ af7 \ langfe1081 \ dbch \ af7 \ afs24 \ alang1081 \ Loch \ f3 \ fs24 \ lang1033 \ ql \ widctlpar \ ธรรมดา \ s0 {\ rtlch \ ltrch \ loch \ fs36 \ loch \ f6

fs36 เปลี่ยนเป็น fs44

มีเพียงฟิลด์อื่นที่เปลี่ยนแปลงคือฟิลด์ revtime ที่คุณอาจต้องการหรือไม่ต้องการอัปเดต:

{\ revtim \ yr2018 \ mo3 \ dy31 \ HR22 \ min19}

การรู้ว่าสิ่งที่เปลี่ยนแปลงไปนั้นทำให้เรามีแบบจำลองสำหรับการพัฒนาวิธีการแบทช์ มีความเป็นไปได้ที่จะบันทึกแมโครที่ทำได้เมื่อเปิดเอกสารหรือพัฒนาสคริปต์ที่เปลี่ยนแปลงตามต้องการ


1

มีเงื่อนงำที่ดีมากมายเกี่ยวกับวิธีที่อาจเกิดขึ้นกับสิ่งนี้ในสเปคRTF

นี่คือการวิเคราะห์ปัญหาของฉัน

ทำสิ่งนี้ให้สำเร็จโดยใช้ CLI ในขณะที่คุณคาดการณ์ว่าจะเป็นวิธีที่ง่ายที่สุดเนื่องจากฉันไม่เห็นแอปพลิเคชั่นที่ทำงานบน GUI ที่สามารถจัดการการแปลงแบบกลุ่มได้ ดูเหมือนว่าคุณสามารถแก้ไขส่วนหัวได้:

ส่วนหัวมีไวยากรณ์ต่อไปนี้:

<header>
    \rtf <charset> \deff? <fonttbl> <filetbl>? <colortbl>? <stylesheet>? <listtables>? <revtbl>?

Each of the various header tables should appear, if they exist, in the above order. Document properties can occur before and between the header tables. A property must be defined before being referenced. Specifically:

* The style sheet must occur before any style usage.

* The font table must precede any reference to a font.

* The \deff keyword must precede any text without an explicit reference to a font, because it specifies the font to use in such cases.

โดยส่วนตัวเมื่อตรวจสอบข้อมูลนี้มันเกิดขึ้นกับฉันว่าทุกสิ่งที่คุณพยายามทำดูเหมือนว่าได้รับการสนับสนุนในส่วนหัวตั้งแต่การเลือกแบบอักษรไปจนถึงสไตล์

มีเครื่องมือที่จะช่วยคุณในกระบวนการนี้ซึ่งฉันจะทำโครงร่างด้านล่างเนื่องจากฉันไม่มีตัวอย่างของรูปแบบเอกสารที่คุณมีหรือรูปแบบของเอกสารที่คุณต้องการและคำตอบทั่วไปน่าจะเป็นประโยชน์ต่อชุมชนมากกว่า หนึ่งเป้าหมายของคุณแน่นอน

grepจะเป็นประโยชน์ในการแยกวิเคราะห์ไฟล์ที่มีอยู่ที่จะแปลงและตัวอย่างของสไตล์เป้าหมายสำหรับที่มีอยู่<fonttbl>และการ
<stylesheet>เลือก เมื่อพิจารณาแล้วว่าสิ่งที่คุณมีจริงแล้วคุณควรจะสามารถเขียนสคริปต์ง่าย ๆ ที่ใช้sedเพื่อแทนที่เนื้อหาส่วนหัวที่มีอยู่ด้วยเนื้อหาส่วนหัวที่ต้องการ มีตัวอย่างมากมายเกี่ยวกับวิธีวนซ้ำผ่านไฟล์ในสคริปต์ทุบตี ( ตัวอย่าง ) และวิธีใช้ประโยชน์ ( ตัวอย่าง ) พร้อมใช้งานได้ฟรีหากคุณไม่คุ้นเคยกับแนวคิดเหล่านี้

นอกจากนี้ยังมีตัวเลือกหนึ่งบรรทัดเพื่อแทนที่สตริงในไฟล์ บางอย่างอาจทำงานได้ดีกว่ากรณีอื่นขึ้นอยู่กับการใช้งานของคุณ ทั้งนี้ขึ้นอยู่กับเนื้อหาของไฟล์ของคุณมันอาจจะหรืออาจจะไม่ทำให้ความรู้สึกที่เรียบง่ายเช่นแทนที่ของทุกfs36ด้วยfs44ซึ่งเปลือกคุณกำลังใช้ยังอาจมีผลต่อวิธีการที่ดีที่สุดในการเขียนการแสดงออกของคุณ ทั้งนี้ขึ้นอยู่กับความซับซ้อนและเนื้อหาของเอกสารของคุณคุณอาจจะดีกว่าการใช้sed, perlหรือgrepหรือบางทีก็รวมกันของพวกเขา เช่นนี้ได้กลายเป็นคำถามการเขียนโปรแกรมดีที่สุดที่จะนำคุณไปยัง/programming/15402770/how-to-grep-and-replaceซึ่งคุณจะพบได้อย่างง่ายดาย 1/2 โหลวิธีการที่แตกต่างกันอย่างใดอย่างหนึ่ง ซึ่งน่าจะเหมาะกับความต้องการของคุณอย่างสมบูรณ์แบบ

ตัวอย่างเช่นหากคุณต้องการใช้การเปลี่ยนแปลงทั้งระบบ

find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \;ตามที่rezizterให้ไว้น่าจะดีที่สุด

หากคุณต้องการให้มีการเปลี่ยนแปลงในไดเรกทอรีเดียว

grep -rl matchstring somedir/ | xargs sed -i 's/fs36/fs44/g'ตามที่Billtianจัดไว้ให้เป็นตัวเลือกที่ยอดเยี่ยม

เพื่อให้ปลอดภัยคุณควรประมวลผลไฟล์ก่อนเพื่อให้มั่นใจว่าการเปลี่ยนแปลงใด ๆ ที่คุณทำอาจไม่ส่งผลกระทบที่ไม่ได้ตั้งใจ ตัวอย่างเช่น

<!-- language: lang-bash -->

    #!/bin/bash
    for f in *.rtf 
        do
        echo $f
        grep fs36
        done

ด้านบนจะแสดงบรรทัดที่มีสตริงการค้นหา fs36 สำหรับไฟล์. rtf แต่ละไฟล์ในไดเรกทอรี

แก้ไข:

ข้อมูลจำเพาะล่าสุดสามารถรับได้ที่นี่ ฉันไม่เห็นการเปลี่ยนแปลงใด ๆ ที่จะส่งผลต่อวิธีการนี้


1
สวัสดีฉันขอขอบคุณสำหรับการอธิบายโซลูชัน CLI แรก กรุณาแบ่งปันตัวอย่างสำหรับวิธีการที่คุณจะเปลี่ยนrtfกับหัวข้อและข้อความที่มีเพื่อให้คำตอบจะขศูนย์กลางในsed sed
JohnDoea

@JohnDoea กระตือรือร้นที่จะช่วยเหลือเสมอ ฉันหวังว่าทั้งคุณและผู้ใช้ในอนาคตจะพบว่ามีประโยชน์
Elder Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.