Измените 2 или больше документа LibreOffice, чтобы иметь то же самое моделирование/форматирование

Скажите, что у меня есть каталог приблизительно с 100 .rtf файлы я редактирую с Устройством записи LibreOffice.

Я требую, чтобы все файлы в том каталоге имели те же самые основные директивы моделирования обогащенного текста, например:

* 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 так или иначе?

14
задан 7 April 2018 в 10:33

3 ответа

Используйте инструменты Libreoffice вместо CLI

Когда все, что Вы имеете, является инструментами командной строки, все похоже на проблему командной строки. Я решил записать этому использованию ответа макросы LibreOffice:

  1. Используйте цикл командной строки для обработки каждого документа Устройства записи в "бездисплейной" среде.
  2. Выполненный макрос для изменения .rtf (Формат RTF) файл документа Устройства записи.
  3. Макрос сохранил файл и выход
  4. Цикл назад к 1.

Создайте данные тестирования

Создайте два или больше файла, содержащие:

richtext2.png

Создайте сценарий ~/Downloads/copy-rtf.sh содержа:

cp ~/Documents/*.rtf ~/Downloads

Mark как исполняемое использование

chmod a+x ~/Downloads/copy-rtf.sh
  • Во время разработки и тестирования, изменения макросов *.rtf файлы будут работать против ~/Downloads каталог.
  • Перед каждым тестовым типом cd ~/Downloads и выполненный ./copy-rtf.sh
  • После того, как вывод прекрасен, они копируются назад в живой каталог.

Каталог Downloads используется потому что:

  • у всех есть a ~/Downloads
  • это добавляется к регулярно и вручную периодически пустело
  • это является более постоянным, чем /tmp/ каталог, который не может сохраниться через перезагрузки.

Выполненный макрос в бездисплейной среде

Используя этот Стек ответ Exchange вызывают Libreoffice Writer из командной строки и передают его глобальное макро-имя для выполнения:

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

Вышеупомянутый ответ не может работать так, другой метод можно попробовать:

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

Установите среду выполнения Java

Для выполнения макросов, Вам нужна установленная среда выполнения Java (JRE). Веб-страница разработчика имеет инструкции для загрузки и установки вручную.

Однако этот AU Вопросы и ответы: https://askubuntu.com/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 в системах Debian.

Третий шаг установки JRE 8 требует, чтобы Вы использовали Вкладку и Вошли для принятия Лицензионного соглашения. Ваша машина приостановится в течение нескольких минут во время самой тяжелой части процедуры установки.

Теперь откройте LibreOffice и выберите Инструменты-> Опции-> LibreOffice-> Усовершенствованный и установите этот экран:

LO JRE8 Advanced Setup.png

Нажмите опции для:

  • Используйте среду выполнения Java
  • Oracle Corporation 1.8.0_161
  • Включите макрос, записывающий (экспериментальный)
  • Нажать "OK"
  • Вас попросят перезапустить, нажать "Restart Now".

Макрос устройства записи LibreOffice

Макрос прочитает весь документ и:

  • измените имя шрифта на Ubuntu.
  • При заголовке 1 размера шрифта набора к 28
  • еще, если размер шрифта является 18 наборами к 22
  • еще установите размер шрифта на 12

Макрос сохранит документ и выйдет из Устройства записи Libreoffice.

Выключите диалоговое окно

Сделайте файл сохраняет, и это диалоговое окно подходит:

LO Writer turn off 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
5
ответ дан 23 November 2019 в 03:06

Вот тот от подхода с помощью Office Libre. Это не пакет, но это может помочь вдохновить другие ответы.

Откройте rtf файл, который имеет шрифт Ubuntu, H1 на уровне 28 ПБ, некоторый текст на уровне 12 ПБ и некоторых на уровне 18 ПБ.

Вот пример:

test rtf

Следующие шаги применят изменение, которое требуют в Вашем вопросе "если размер шрифта: 18 пкс {делают это 22 пкс} # Весь текст с размером шрифта, 18 пкс - теперь 22 пкс";

Нажмите Edit →, Находят и Замена в меню или совершают нападки, поле Click Search For опций CtrlH Other затем приписывает флажок Размера шрифта кнопки затем, кнопка Format выбирает 18 ПБ из ползунка на крайнем правом, Нажимают Replace полем затем кнопка Format и выбирают 22 ПБ из ползунка на крайнем правом

FindNreplace

Нажмите Replace All

применимая строка, которая изменилась, была:

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

fs36 изменяется на fs44

единственное другое поле, которое изменилось, было revtime полем, которое Вы можете или не можете хотеть обновлять:

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

Знание, что изменилось, предоставляет нам модель для разработки пакетного подхода. Вероятно, возможно Записать Макрос, который делает это после открытия документа или разработать сценарий, который вносит изменения, как желаемый.

2
ответ дан 23 November 2019 в 03:06

Существуют некоторые большие подсказки о том, как можно было бы пойти об этом в спецификации 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 заменять существующий контент заголовка желаемым контентом заголовка. Существуют многочисленные примеры того, как выполнить итерации через файлы в сценарии удара (пример) и как использовать sed (пример), в свободном доступе, если Вы незнакомы с этими понятиями.

Существуют также опции строки заменить строку в файле. Некоторые могут работать лучше, чем другие в зависимости от Вашего варианта использования. В зависимости от содержания Ваших файлов это может или не может иметь смысла к простой замене каждый экземпляр fs36 с fs44 То, которые окружают Вас, используют, может также иметь влияние, как лучше всего записать Ваши выражения. В зависимости от сложности и содержания Ваших документов можно быть более обеспеченным использованием sed, perl или grep или возможно даже комбинация их. Поскольку это стало вопросом о программировании, лучше отсылать Вас к https://stackoverflow.com/questions/15402770/how-to-grep-and-replace, где Вы найдете легко 1/2 дюжины разными подходами, один из которых, вероятно, удовлетворит Вашим потребностям отлично.

Например, если Вы хотите применить эти изменения в масштабе всей системы,

find /path/to/files -type f -exec sed -i 's/oldstring/newstring/g' {} \; как предусмотрено byrezizter вероятен лучшее.

Если Вы хотите содержать свои изменения в единственном каталоге,

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
ответ дан 23 November 2019 в 03:06

Другие вопросы по тегам:

Похожие вопросы: