CLIの代わりにLibreofficeツールを使用する
持っているのがコマンドラインツールだけであれば、すべてがコマンドラインの問題のように見えます。LibreOfficeマクロを使用してこの答えを書くことにしました。
- コマンドラインループを使用して、すべてのWriterドキュメントを「ヘッドレス」環境で処理します。
- 変更するマクロを実行
.rtf
(リッチテキスト形式)Writerドキュメントファイルます。
- マクロはファイルを保存して終了します
- 1にループバックします。
テストデータを作成する
以下を含む2つ以上のファイルを作成します。
以下~/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ランタイム環境をインストールする
マクロを実行するには、Java Runtime Environment(JRE)がインストールされている必要があります。開発者のWebページに手順があります、手動でダウンロードしてインストールするためのがあります。
ただし、このAU Q&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&Aメソッドを試しましたが、PPAを追加する最初のステップの後、追加情報を含むスプラッシュ画面が表示されます。最も役立つのは、DebianシステムでJRE 8をセットアップするためのリンクです。
JRE 8をインストールする3番目の手順では、ライセンス契約を使用TabしEnterて同意する必要があります。インストールルーチンの最も重い部分の間、マシンは数分間停止します。
LibreOfficeを開き、[ ツール] -> [ オプション] -> [ LibreOffice] -> [ 詳細設定]を選択して、この画面をセットアップします。
次のオプションをクリックします。
- Javaランタイム環境を使用する
- Oracle Corporation 1.8.0_161
- マクロ記録を有効にする(実験的)
- OKをクリック
- 再起動するように求められたら、[今すぐ再起動]をクリックします。
LibreOffice Writerマクロ
マクロは文書全体を読み通し、次のことを行います。
- フォント名をUbuntuに変更します。
- 見出し1の場合、フォントサイズを28に設定します
- それ以外の場合、フォントサイズが18で22に設定されている場合
- それ以外の場合は、フォントサイズを12に設定します
マクロはドキュメントを保存し、Libreoffice Writerを終了します。
ダイアログをオフにする
ファイルを保存すると、このダイアログが表示されます:
画面に表示されるこのメッセージをオフにします。このオプションがオンの場合、マクロは正しく実行されない場合があります。
マクロの内容
「ツール」->「マクロ」->「マクロの記録」->「基本」を使用してマクロを記録しようと数日費やしました。最初は有望に見えましたが、記録されたマクロは一貫性のない動作をし、手書きの基本マクロのために放棄されなければなりませんでした。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