CLI 대신 Libreoffice 도구 사용
명령 줄 도구 만 있으면 모든 것이 명령 줄 문제처럼 보입니다. LibreOffice 매크로를 사용하여이 답변을 작성하기로 결정했습니다.
- "headless"환경에서 모든 Writer 문서를 처리하려면 명령 행 루프를 사용하십시오.
- 매크로를 실행하여
.rtf
(Rich Text Format) 작성기 문서 파일 을 변경 하십시오.
- 매크로는 파일을 저장하고 종료합니다
- 1로 되돌아갑니다.
테스트 데이터 생성
다음을 포함하는 둘 이상의 파일을 작성하십시오.
다음을 ~/Downloads/copy-rtf.sh
포함하는 스크립트 를 작성하십시오 .
cp ~/Documents/*.rtf ~/Downloads
다음을 사용하여 실행 가능으로 표시
chmod a+x ~/Downloads/copy-rtf.sh
- 개발 및 테스트 중에
*.rtf
파일을 수정하는 매크로 는 ~/Downloads
디렉토리 에 대해 실행됩니다 .
- 각 테스트 유형
cd ~/Downloads
및 실행 전에./copy-rtf.sh
- 출력이 완료되면 라이브 디렉토리로 다시 복사됩니다.
Downloads 디렉토리는 다음과 같은 이유로 사용됩니다.
- 모두가
~/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 설치
매크로를 실행하려면 JRE (Java Runtime Environment)가 설치되어 있어야합니다. 개발자의 웹 페이지에는 수동으로 다운로드하고 설치 하기 위한 지침 이 있습니다.
그러나이 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
AU Q & A 방법을 사용해 보았고 PPA를 추가하는 첫 단계 후에 추가 정보가 포함 된 스플래시 화면이 나타납니다. 가장 유용한 것은 데비안 시스템에서 JRE 8 을 설정 하는 링크 입니다.
JRE 8을 설치하는 세 번째 단계 에서는 라이센스 계약 을 사용 Tab하고 Enter동의 해야합니다 . 설치 루틴 중 가장 많은 시간 동안 기계가 몇 분 동안 일시 정지됩니다.
이제 LibreOffice를 열고 도구 -> 옵션 -> LibreOffice- > 고급 을 선택하고이 화면을 설정하십시오.
다음에 대한 옵션을 클릭하십시오.
- Java 런타임 환경 사용
- Oracle Corporation 1.8.0_161
- 매크로 기록 사용 (실험)
- 확인을 클릭하십시오
- 다시 시작하라는 메시지가 표시되면 "지금 다시 시작"을 클릭하십시오.
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