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

С помощью Seahorse можно редактировать / удалять пароли для общих сетевых ресурсов.

Введите seahorse в тире. Выберите вкладку Пароли, нажмите стрелку вправо после значка папки, чтобы вывести список паролей. Выберите свой ресурс и щелкните правой кнопкой мыши -> Удалить.

При следующей попытке монтирования вам потребуется указать новый пароль.

13
задан 7 April 2018 в 20:33

4 ответа

Есть несколько отличных подсказок о том, как это можно сделать в спецификации RTF.

Вот мой анализ проблемы.

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

Заголовок имеет следующий синтаксис: <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.

Лично, после просмотра этой информации мне приходит в голову, что все, что вы пытаетесь (d1)

Существуют инструменты, которые помогут вам в этом процессе, который я опишу ниже, поскольку я не знаю, как это сделать, t есть пример стиля документа, который у вас есть, и стиль документа, который вы хотите, и более общий ответ, скорее всего, будет более полезен для сообщества, чем тот, который нацелен на вашу точную ситуацию.

grep будет полезно проанализировать существующие файлы, которые нужно преобразовать, и образец целевого стиля для существующих <fonttbl> и <stylesheet> вариантов. Определив, что у вас есть на самом деле, вы должны иметь возможность написать простой скрипт, используя sed, чтобы заменить существующий контент заголовка на нужное содержимое заголовка. Существует множество примеров того, как выполнять итерацию через файлы в сценарии bash (пример) и как свободно использовать sed (пример), если вы не знакомы с этими понятиями.

Есть также одна строка для замены строка в файле. Некоторые могут работать лучше, чем другие, в зависимости от вашего варианта использования. В зависимости от содержимого ваших файлов может быть или нет смысла просто заменять каждый экземпляр fs36 на fs44. В какой оболочке вы используете, может также повлиять на то, как лучше всего писать ваши выражения. В зависимости от сложности и содержания ваших документов вам может быть лучше использовать sed, perl или grep или, возможно, даже их комбинацию. Поскольку это стало вопросом программирования, лучше всего отнести вас к примеру , где вы легко найдете полдюжины разных подходов, один из которых вполне подходит вашим потребностям.

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

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', предоставленный rezizter , является отличным выбором.

Чтобы быть в безопасности, вы должны предварительно обработать файлы, чтобы гарантировать, что любые изменения, которые вы можете сделать, не будут иметь непреднамеренных последствий. Например:

<!-- language: lang-bash --> #!/bin/bash for f in *.rtf do echo $f grep fs36 done

Вышеуказанные строки будут отображать строки, содержащие строку поиска fs36 для каждого файла .rtf в каталоге.

У меня нет примера от стиля документа, который у вас есть, и стиля документа, который вы хотите

. Последнюю спецификацию можно получить здесь. Я не вижу никаких изменений, которые должны повлиять на этот подход.

2
ответ дан 17 July 2018 в 17:58

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

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

Используйте цикл командной строки для обработки каждого документа Writer в «безголовой» среде. Запустите макрос, чтобы изменить файл документа Writer .rtf (Rich Text Format). Макрос сохраняет файл и возвращает Loop обратно в 1.

Создать тестовые данные

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

Создать скрипт ~/Downloads/copy-rtf.sh, содержащий:

cp ~/Documents/*.rtf ~/Downloads

Отметить как исполняемый файл с помощью

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

Каталог «Загрузки» используется, потому что:

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

Запустите макрос в безголовом environment

Используя этот , вызовите 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 Q & amp; A: 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 Q & amp; A и после первого шага добавления PPA появляется заставка с дополнительной информацией. Наиболее полезной является ссылка на https://askubuntu.com/a/728153/307523 .

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

Теперь откройте LibreOffice и выберите Tools -> Options -> LibreOffice -> Advanced и настройте этот экран:

richtext2.png [!d12]

Щёлкните по параметрам:

, который добавляется регулярно и вручную опустошается Oracle Corporation 1.8.0_161 ] После того, как вывод прекрасен, они будут скопированы обратно в живую директорию. Нажмите «ОК». Вам будет предложено перезагрузить компьютер, нажмите «Перезагрузить сейчас».

LibreOffice Writer Macro

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

Oracle Corporation 1.8.0_161 [ ! d52] Если заголовок 1 задает размер шрифта до 28 Нажмите OK , а затем установите размер шрифта до 12

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

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

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

richtext2.png [!d12]

Включите это сообщение выключено, как показано на экране.

Макросъемка

Я потратил несколько дней на попытку записи макроса с помощью «Инструменты» -> «Макросы» -> «Макросы» - Record Macro "->" Basic ". Сначала это казалось многообещающим, но записанный макрос имел непоследовательное поведение и должен был быть оставлен для рукописного основного макроса. Найденная помощь в Stack Overflow для эксперта там, чтобы помочь мне с базовой базовой кодировкой. Вот результат:

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
4
ответ дан 17 July 2018 в 17:58

Есть несколько отличных подсказок о том, как это можно сделать в спецификации RTF.

Вот мой анализ проблемы.

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

Заголовок имеет следующий синтаксис: <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.

Лично, после просмотра этой информации мне приходит в голову, что все, что вы пытаетесь (d1)

Существуют инструменты, которые помогут вам в этом процессе, который я опишу ниже, поскольку я не знаю, как это сделать, t есть пример стиля документа, который у вас есть, и стиль документа, который вы хотите, и более общий ответ, скорее всего, будет более полезен для сообщества, чем тот, который нацелен на вашу точную ситуацию.

grep будет полезно проанализировать существующие файлы, которые нужно преобразовать, и образец целевого стиля для существующих <fonttbl> и <stylesheet> вариантов. Определив, что у вас есть на самом деле, вы должны иметь возможность написать простой скрипт, используя sed, чтобы заменить существующий контент заголовка на нужное содержимое заголовка. Существует множество примеров того, как выполнять итерацию через файлы в сценарии bash (пример) и как свободно использовать sed (пример), если вы не знакомы с этими понятиями.

Есть также одна строка для замены строка в файле. Некоторые могут работать лучше, чем другие, в зависимости от вашего варианта использования. В зависимости от содержимого ваших файлов может быть или нет смысла просто заменять каждый экземпляр fs36 на fs44. В какой оболочке вы используете, может также повлиять на то, как лучше всего писать ваши выражения. В зависимости от сложности и содержания ваших документов вам может быть лучше использовать sed, perl или grep или, возможно, даже их комбинацию. Поскольку это стало вопросом программирования, лучше всего отнести вас к примеру , где вы легко найдете полдюжины разных подходов, один из которых вполне подходит вашим потребностям.

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

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', предоставленный rezizter , является отличным выбором.

Чтобы быть в безопасности, вы должны предварительно обработать файлы, чтобы гарантировать, что любые изменения, которые вы можете сделать, не будут иметь непреднамеренных последствий. Например:

<!-- language: lang-bash --> #!/bin/bash for f in *.rtf do echo $f grep fs36 done

Вышеуказанные строки будут отображать строки, содержащие строку поиска fs36 для каждого файла .rtf в каталоге.

У меня нет примера от стиля документа, который у вас есть, и стиля документа, который вы хотите

. Последнюю спецификацию можно получить здесь. Я не вижу никаких изменений, которые должны повлиять на этот подход.

1
ответ дан 23 July 2018 в 18:49
  • 1
    Здравствуйте, я благодарю вас за первое описание решения CLI. Пожалуйста, поделитесь примером кода, как вы измените rtf с заголовком и текстом с sed, чтобы ответ был централизован в sed. – JohnDoea 31 March 2018 в 21:25
  • 2
    @JohnDoea Always хочет помочь. Надеюсь, вам и будущим пользователям это будет полезно. – Elder Geek 2 April 2018 в 01:17

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

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

Используйте цикл командной строки для обработки каждого документа Writer в «безголовой» среде. Запустите макрос, чтобы изменить файл документа Writer .rtf (Rich Text Format). Макрос сохраняет файл и возвращает Loop обратно в 1.

Создать тестовые данные

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

Создать скрипт ~/Downloads/copy-rtf.sh, содержащий:

cp ~/Documents/*.rtf ~/Downloads

Отметить как исполняемый файл с помощью

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

Каталог «Загрузки» используется, потому что:

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

Запустите макрос в безголовом environment

Используя этот , вызовите 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 Q & amp; A: 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 Q & amp; A и после первого шага добавления PPA появляется заставка с дополнительной информацией. Наиболее полезной является ссылка на https://askubuntu.com/a/728153/307523 .

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

Теперь откройте LibreOffice и выберите Tools -> Options -> LibreOffice -> Advanced и настройте этот экран:

richtext2.png [!d12]

Щёлкните по параметрам:

, который добавляется регулярно и вручную опустошается Oracle Corporation 1.8.0_161 ] После того, как вывод прекрасен, они будут скопированы обратно в живую директорию. Нажмите «ОК». Вам будет предложено перезагрузить компьютер, нажмите «Перезагрузить сейчас».

LibreOffice Writer Macro

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

Oracle Corporation 1.8.0_161 [ ! d52] Если заголовок 1 задает размер шрифта до 28 Нажмите OK , а затем установите размер шрифта до 12

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

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

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

richtext2.png [!d12]

Включите это сообщение выключено, как показано на экране.

Макросъемка

Я потратил несколько дней на попытку записи макроса с помощью «Инструменты» -> «Макросы» -> «Макросы» - Record Macro "->" Basic ". Сначала это казалось многообещающим, но записанный макрос имел непоследовательное поведение и должен был быть оставлен для рукописного основного макроса. Найденная помощь в Stack Overflow для эксперта там, чтобы помочь мне с базовой базовой кодировкой. Вот результат:

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
4
ответ дан 23 July 2018 в 18:49

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

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