सटीक एक ही स्टाइल / स्वरूपण के लिए 2 या अधिक लिब्रे ऑफिस दस्तावेज़ बदलें


14

मान लें कि मेरे पास .rtfलिबरऑफिस राइटर के साथ संपादित 100 फाइलों के साथ एक निर्देशिका है ।

मेरी इच्छा है कि उस निर्देशिका की सभी फ़ाइलों में ठीक उसी तरह के मूल समृद्ध पाठ स्टाइल-निर्देश होंगे, उदाहरण के लिए:

* 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;

और आगे तो ... इसलिए, मूल रूप से मैं एक ही बार में सभी फ़ाइलों को बदलना चाहता हूं। क्या ऐसा "बल्क-स्टाइलिंग" संभव है?

शायद यह किसी तरह सीएलआई के साथ संभव है?


3
मुझे लगता है कि यह एक आसान काम नहीं होगा। यदि वे सभी उसी तरह संरचित हैं, तो आप शायद कमांड लाइन से .rtf फ़ाइलों में पाठ को बदलने के साथ कुछ हैकी समाधान का उपयोग कर सकते हैं। हालाँकि, यह बहुत कुछ इस बात पर निर्भर करता है कि rtf फाइलें कैसी दिखती हैं और वे कितनी समान हैं।
सेबस्टियन स्टार्क

मुझे पूरी तरह से नए लिब्रे ऑफिस राइटर मैक्रो के लिए स्टैक ओवरफ्लो में मदद मिली है जो आज रात से शुरू हो रहा है। हमें अब हर संभव मौजूदा फ़ॉन्ट आकार जानने की आवश्यकता नहीं है।
विनयुनुच्स

एक अंतिम खाई के प्रयास में मैंने स्टैक ओवरफ्लो विशेषज्ञों से कहा है कि अनुग्रह अवधि समाप्त होने से पहले यहां एक उत्तर पोस्ट करें: stackoverflow.com/questions/49640951/…
WinEunuuchs2Unix

आप लोगों के पास दसियों हजार प्रतिष्ठा के बिंदु हैं। मैं विनम्रतापूर्वक सुझाव देता हूं कि आप 500-750 जैसे कुछ देने पर विचार करें। सिर्फ एक विचार। बस अभी-अभी।
जॉनडियो

जवाबों:


5

सीएलआई के बजाय लिब्रॉफिस टूल का उपयोग करें

जब आपके पास कमांड लाइन टूल होते हैं तो सब कुछ कमांड लाइन समस्या की तरह दिखता है। मैंने लिबर ऑफिस मैक्रोज़ का उपयोग करके यह उत्तर लिखने का फैसला किया है:

  1. एक "हेडलेस" वातावरण में हर लेखक दस्तावेज़ को संसाधित करने के लिए कमांड लाइन लूप का उपयोग करें।
  2. .rtf(रिच टेक्स्ट फॉर्मेट) राइटर डॉक्यूमेंट फ़ाइल को बदलने के लिए मैक्रो चलाएँ ।
  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/निर्देशिका से अधिक स्थायी है जो रिबूट के पार नहीं रह सकती है।

सिर रहित वातावरण में मैक्रो चलाएँ

इस स्टैक एक्सचेंज के जवाब का उपयोग करके कमांड लाइन से लिबरऑफिस राइटर को आमंत्रित करें और इसे निष्पादित करने के लिए एक वैश्विक मैक्रो नाम दें:

soffice -headless -invisible "vnd.sun.star.script:Standard.Module1.MySubroutine? language=Basic&location=application"

उपर्युक्त उत्तर काम नहीं कर सकता है इसलिए किसी अन्य विधि की कोशिश की जा सकती है:

soffice "macro:///Standard.SaveCSV.Main" $1

जावा रनटाइम पर्यावरण स्थापित करें

मैक्रोज़ को चलाने के लिए आपको जावा रनटाइम एनवायरनमेंट (JRE) की आवश्यकता है। डेवलपर के वेब पेज पर मैन्युअल रूप से डाउनलोड और इंस्टॉल करने के निर्देश हैं

हालाँकि यह AU Q & A: /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

मैंने एयू क्यू एंड ए पद्धति की कोशिश की और पीपीए को जोड़ने के पहले चरण के बाद अतिरिक्त जानकारी के साथ एक छप स्क्रीन दिखाई देती है। सबसे ज्यादा मददगार डेबियन सिस्टम पर JRE 8 स्थापित करने की एक कड़ी है ।

जेआरई 8 को स्थापित करने के तीसरे चरण के लिए आपको लाइसेंस समझौते का उपयोग करने Tabऔर Enterस्वीकार करने की आवश्यकता होती है । आपकी मशीन स्थापना दिनचर्या के सबसे भारी हिस्से के दौरान कुछ मिनटों के लिए रुक जाएगी।

अब LibreOffice खोलें और टूल्स -> Options -> LibreOffice -> एडवांस्ड और इस स्क्रीन को सेटअप करें:

LO JRE8 एडवांस्ड सेटअप.पिंग

इसके लिए विकल्पों पर क्लिक करें:

  • जावा रनटाइम वातावरण का उपयोग करें
  • ओरेकल कॉर्पोरेशन 1.8.0_161
  • मैक्रो रिकॉर्डिंग (प्रयोगात्मक) सक्षम करें
  • ओके पर क्लिक करें
  • आपको पुनरारंभ करने के लिए कहा जाएगा, "अभी पुनरारंभ करें" पर क्लिक करें।

लिब्रे ऑफिस राइटर मैक्रों

मैक्रो पूरे दस्तावेज़ के माध्यम से पढ़ा जाएगा और:

  • फ़ॉन्ट नाम को Ubuntu में बदलें।
  • यदि 1 सेट फ़ॉन्ट का आकार 28 है
  • और यदि फ़ॉन्ट का आकार 18 से 22 पर सेट है
  • और फ़ॉन्ट आकार 12 पर सेट करें

मैक्रो दस्तावेज़ को बचाएगा और लिब्रेऑफ़िस राइटर से बाहर निकलेगा।

डायलॉग बंद करें

एक फ़ाइल सहेजें और यह डायलॉग आता है:

LO लेखक RTF डायलॉग बंद करें। भाषा

स्क्रीन में शो के रूप में इस संदेश को बंद करें। यदि यह विकल्प चालू है तो मैक्रो ठीक से नहीं चल सकता है।

मैक्रो कंटेंट

मैंने "टूल" -> "मैक्रोज़" -> "रिकॉर्ड मैक्रो" -> "बेसिक" का उपयोग करके मैक्रो को रिकॉर्ड करने का प्रयास करते हुए कुछ दिन बिताए। पहले तो यह आशाजनक लग रहा था लेकिन रिकॉर्ड किए गए मैक्रो में असंगत व्यवहार था और हाथ से लिखी बेसिक मैक्रो के लिए छोड़ दिया जाना था। स्टैक ओवरफ्लो में एक विशेषज्ञ ने मुझे मूल बुनियादी कोडिंग के साथ मदद करने के लिए एक मदद मिली । यहाँ परिणाम है:

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

यहां लिबर ऑफिस का उपयोग करते हुए एक बंद दृष्टिकोण है। यह बैच नहीं है, लेकिन यह अन्य उत्तरों को प्रेरित करने में मदद कर सकता है।

एक rtf फाइल खोलें, जिसमें उबंटू फ़ॉन्ट, H1 28 pt पर, कुछ टेक्स्ट 12pt पर और कुछ 18 pt पर है।

यहाँ एक उदाहरण है:

परीक्षण rtf

निम्नलिखित चरण आपके प्रश्न में अनुरोधित परिवर्तन को लागू करेंगे "यदि फ़ॉन्ट-आकार: 18px {इसे 22px करें। # फ़ॉन्ट-आकार 18px वाला सभी पाठ अब 22px है;"

संपादन पर क्लिक करें → मेनू पर खोजें और बदलें या CtrlHअन्य विकल्प हिट करें बॉक्स के लिए खोजें पर क्लिक करें फिर बटन बटन का आकार चेक बॉक्स तब प्रारूप बटन दाईं ओर स्क्रॉल बॉक्स से 18 पीटी का चयन करें बॉक्स के साथ बदलें फिर प्रारूप बटन पर क्लिक करें और 22 पीटी से चयन करें। स्क्रॉल बॉक्स पर दाईं ओर जाएं

FindNreplace

सभी को बदलें पर क्लिक करें

लागू होने वाली लाइन थी:

\ par \ pard \ plain \ s0 \ ql \ widectlpar \ hyphpar0 \ ltrpar \ cf1 \ kern1 \ dbch \ af7 \ langfe1081 \ dbch \ af7 \ als10 \ alch1081 \ loch \ f324_ lang1033 \ ql \ ll1033 \ ql \ n {A rtlch \ ltrch \ loch \ fs36 \ loch \ f6

fs36 बदलकर fs44 हो गया

केवल दूसरा फ़ील्ड जो बदला गया था वह था रिफ़टाइम फ़ील्ड जिसे आप अपडेट करना चाहते हैं या नहीं कर सकते हैं:

{\ Revtim \ yr2018 \ MO3 \ dy31 \ HR22 \ min19}

एक बैच दृष्टिकोण विकसित करने के लिए एक मॉडल के साथ हमें क्या प्रदान करता है, यह जानना। एक मैक्रो को रिकॉर्ड करना संभव है जो एक दस्तावेज़ को खोलने या एक स्क्रिप्ट विकसित करने के लिए करता है जो परिवर्तनों को वांछित बनाता है।


1

आरटीएफ विनिर्देश में कोई इस बारे में कुछ महान सुराग दे सकता है

यहाँ इस मुद्दे का मेरा विश्लेषण है।

सीएलआई का उपयोग करते हुए इसे पूरा करना क्योंकि आप सबसे सरल दृष्टिकोण प्रतीत होंगे क्योंकि मैंने कोई जीयूआई आधारित एप्लिकेशन नहीं देखा है जो इस प्रकार के बैच रूपांतरण को संभाल सकता है। ऐसा प्रतीत होता है कि आप हेडर को केवल संशोधित कर सकते हैं:

शीर्ष लेख में निम्न सिंटैक्स है:

<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मौजूदा हेडर सामग्री को वांछित हेडर सामग्री के साथ बदलने के लिए उपयोग करने वाली एक सरल स्क्रिप्ट लिखने में सक्षम होना चाहिए । यदि आप इन अवधारणाओं से अपरिचित हैं, तो bash script ( उदाहरण ) में फ़ाइलों के माध्यम से पुनरावृत्ति करने और 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'जैसा कि बिलियन द्वारा प्रदान किया गया एक उत्कृष्ट विकल्प है।

सुरक्षित पक्ष पर रहने के लिए आपको फ़ाइलों को यह सुनिश्चित करने के लिए रोकना चाहिए कि आपके द्वारा किए गए कोई भी परिवर्तन अनपेक्षित परिणाम नहीं होंगे। उदाहरण के लिए:

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

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

ऊपर निर्देशिका में प्रत्येक .rtf फ़ाइल के लिए खोज स्ट्रिंग fs36 युक्त लाइनें प्रदर्शित होंगी।

संपादित करें:

सबसे हालिया विनिर्देश यहां प्राप्त किया जा सकता है। मुझे कोई भी परिवर्तन नहीं दिखाई दे रहा है जो इस दृष्टिकोण को प्रभावित करे।


1
नमस्कार, मैं सबसे पहले आपको CLI समाधान बताने के लिए धन्यवाद देता हूं। कृपया एक कोड उदाहरण साझा करें कि आप rtfशीर्षक और पाठ के साथ कैसे बदलेंगे sedताकि उत्तर केंद्रीकृत हो sed
जॉनडोआ

@ जॉनडोआ हमेशा मदद के लिए उत्सुक रहते हैं। मुझे आशा है कि आप और भावी उपयोगकर्ता दोनों इसे उपयोगी पाएंगे।
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.