인기 있는 GNU/Linux 배포판의 Bash 터미널에서 비밀번호로 보호되지 않은 [OpenDocument Text(.odt)](OpenDocument Text) 문서를 비밀번호로 보호된 문서로 변환하는 방법은 무엇입니까?
불행하게도 LibreOffice 매뉴얼 페이지에는 "password"라는 문자열도 포함되어 있지 않으므로 여기서는 별로 도움이 되지 않습니다.
다음과 같은 암호화된 컨테이너에 파일을 포장하고 싶지 않습니다.압축파일LibreOffice에서 열려면 먼저 압축을 풀어야 합니다. 중요한 점은 파일 수신자가 파일을 열기 위해 LibreOffice를 사용할 필요가 없으며 파일 비밀번호 이외의 정보를 알 필요가 없다는 것입니다.
가능하다면 원하는 결과를 얻기 위해 LibreOffice 자체 및/또는 표준 GNU/Linux 유틸리티를 사용하는 것을 선호합니다. 그렇지 않다면 일반적으로 GNU/Linux 배포판용으로 패키지된 무료 소프트웨어 응용 프로그램을 사용하는 편이 낫습니다.
답변1
제가 만든 모듈은 오류 검사가 없기 때문에 귀중한 파일을 파괴할 수 있습니다.사용에 따른 위험은 사용자 본인이 부담하고, 신뢰할 수 있는 백업을 준비하고, 절대로 루트 권한으로 이 프로그램을 실행하지 마십시오!
계층; 의사:
- 모듈 콘텐츠 다운로드여기그리고 어딘가에 저장해 보세요.
- 도구->매크로->매크로 구성->libreoffice basic을 통해
Libreoffice
매크로 구성을 시작하고 입력합니다 . - 왼쪽 매크로 목록에서 "LibreOffice Macros" 컨테이너에 "Tools"라는 라이브러리가 있는지 확인하세요(그 안에 매크로가 필요함)
- 대화 상자 오른쪽의 "Organizer"를 선택하십시오.
- "내 매크로" 컨테이너를 열고 "표준"을 선택한 다음 오른쪽에서 "새로 만들기"를 선택합니다.
- 모듈 이름을 "saveWithPassword"로 지정합니다.
- 새로 생성된 모듈이 강조 표시된 상태에서 편집을 선택합니다. 그러면 IDE가 열리고 새 모듈이 표시됩니다.
- 올바른 모듈을 선택했는지 확인한 다음 편집기 창의 내용을 삭제하십시오.
- 예를 들어 GUI 편집기를 사용하여 다운로드한 모듈 파일을 열고
gedit
모두 선택한 다음 전체 소스 코드를 잘라내어 LibreOffice 편집기 창에 붙여넣습니다. 저장하고 닫으면 완료됩니다. - 프로그래밍 및 디버깅에 익숙하다면 .odt 파일을 열고, 매크로 IDE(위)를 열고, 매크로를 단계별로 실행하고, 변수의 내용을 볼 수 있습니다.
이제 매크로를 어떻게 사용하나요?
동일한 비밀번호로 보호해야 하는 .odt 파일 목록이 있다고 가정해 보겠습니다. 원본 파일을 그대로 유지하려면 보호된 파일을 다른 대상 폴더(반드시 존재해야 함)에 저장해야 합니다. 그럼 네가 전화해
$ lowriter --invisible <list of .odt files> macro:///standard.saveWithPasswd.saveWithPasswd
(제안된 대로 모듈을 생성했다고 가정합니다.) 파일이 로드되면 매크로가 시작되고 대상 디렉터리와 비밀번호를 묻는 메시지가 표시됩니다. 그러면 문서가 대상 디렉터리에 저장되고 제공된 비밀번호로 보호됩니다.
Windows에서 모든 문서를 열지 않으려면 두 번째(자동) 방법이 있습니다.
LibreOffice
실행 중인 인스턴스 가 없는지 확인하세요 . 그런 다음 실행
$ export password=<the password to use>
$ export target=<full path to the target directory>
$ lowriter --headless <list of .odt files> macro:///standard.saveWithPasswd.saveWithPasswd
지금 자세히 알아보기
주요 기능은 비밀번호로 보호된 파일을 작성하는 것입니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 대화형으로 수행할 작업을 기록하면 다음과 같은 결과가 나타납니다.
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///home/user/Untitled%201.odt"
args1(1).Name = "FilterName"
args1(1).Value = "writer8"
args1(2).Name = "EncryptionData"
args1(2).Value = Array(Array("PackageSHA256UTF8EncryptionKey",Array(-14,-81,-47,-54,-53,84,65,-91,-26,90,122,70,10,95,-104,-104,-73,-71,-117,8,-86,99,35,-94,-27,60,-117,-102,-106,-122,-51,-122)),Array("PackageSHA1UTF8EncryptionKey",Array(24,97,84,113,43,45,95,103,-111,-40,91,-102,9,-121,-71,-113,-94,49,119,-100)),Array("PackageSHA1MS1252EncryptionKey",Array(24,97,84,113,43,45,95,103,-111,-40,91,-102,9,-121,-71,-113,-94,49,119,-100)))
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
뭐가 너무 복잡해요?
[2] 5.8.3에서는 더 간단한 해결책을 찾았습니다.
Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sURL$
args(0).Name ="Password"
args(0).Value = "test"
sURL=ConvertToURL("/andrew0/home/andy/test.odt")
ThisComponent.storeToURL(sURL, args())
지금 해야 할 대부분의 작업은
- 비밀번호와 대상 파일 이름/디렉토리를 매크로에 전달
- 열린 문서 반복
- 환경 변수 및 대화 상자 사용
- 기존 라이브러리 함수 찾기 및 사용
모듈의 일부 부분을 더 자세히 설명하겠습니다(나머지는 사소한 것 같습니다).
GlobalScope.BasicLibraries.loadLibrary("Tools")
그러면 전역 LibreOffice
라이브러리 "Tools"가 로드됩니다. 이러한 매크로 중 일부는 문자열 처리 등에 사용됩니다.
oComponents = StarDesktop.getComponents()
oDocs = oComponents.createEnumeration()
Do While oDocs.hasMoreElements()
oDoc = oDocs.nextElement()
.
.
Loop
이는 현재 열려 있는 문서/프레임을 반복합니다. 테스트 및 디버깅의 경우 IDE도 열려 있으므로 프레임워크에 실제로 유효한 문서가 포함되어 있는지 테스트해야 합니다.
sUrl = oDoc.getUrl()
If sUrl <> "" Then
이제 문서가 URL을 정의하면(실제로 존재하는지 테스트하지 마세요...) 새 URL이 생성되고 문서는 비밀번호와 함께 저장됩니다.
sName = FileNameoutofPath(sUrl)
sName = myTargetDir & "/" & sName
sUrl = ConvertToURL(sName)
aArgs(0).Name = "Password"
aArgs(0).Value = myPassword
oDoc.storeToURL(sURL, aArgs())
oDoc.close(true)
여기서는 "도구" 라이브러리의 기능이 사용됩니다. 특히 lowriter
옵션으로 호출할 경우 --headless
문서는 마지막에 닫혀야 하며, 그렇지 않으면 lowriter
종료되지 않습니다.
"비밀번호"와 "대상 디렉터리"를 매개변수로 모듈에 전달할 수 없기 때문에 두 가지 방법을 사용합니다. 쉘 환경 변수(완전 자동화될 수 있으므로)와 대화 상자 입력입니다.
"Environ" 기능과 기본 "InputBox"를 사용하면 비밀번호를 얻는 것이 매우 간단합니다. 비밀번호를 입력하는 동안 비밀번호를 숨기려면 고유한 대화 상자를 만들어야 합니다.
대상 폴더를 선택하는 것은 간단한 런타임 기능이 아니기 때문에 약간 까다롭습니다.
oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
InitPath = GetPathSettings("Work")
If oUcb.Exists(InitPath) Then
oFileDialog.SetDisplayDirectory(InitPath)
End If
정적 "InitPath"(열 때 "FolderPicker"가 시작되는 경로)를 사용하기로 결정한 경우 이를 정의하고 에서 까지의 oUcb =
모든 항목을 잘라낼 수 있습니다 . 명령줄에서 실행할 때 을(를) 설정할 수도 있습니다 . 이제 시작 폴더는 설정에서 "내 문서" 폴더로 정의한 폴더입니다 .End If
oFileDialog.SetDisplayDirectory
InitPath = Environ("PWD")
LibreOffice
oFileDialog.SetTitle(sTitle)
iAccept = oFileDialog.Execute()
If iAccept = 1 Then
sPath = oFileDialog.Directory
getFolderName = sPath
End If
나는 이것이 자명하다고 생각합니다. 그러나 여기서는 오류 검사가 없다는 점에 유의하십시오. 파일 대화 상자를 취소하면 TargetPath가 정의되지 않습니다. 이로 인해 매크로가 완전히 중단되거나 in while
대신 루프 를 정의해야 합니다 .If
askForTarget
Do While myTargetDir = ""
myTargetDir = getFolderName("Please select output directory")
Loop
이해했구나...
내가 생각할 수 있는 많은 수정 사항이 있습니다. 먼저 오류 검사를 통해 원본 파일을 덮어쓰거나(예: TargetDir
null 테스트) 손상되지 않았는지 확인합니다 . 또는 원래 파일 이름, 대상 및 비밀번호를 사용하여 텍스트 파일을 생성하고 매크로에 전달하여 순서대로 완료합니다. 또는 모든 원본 문서를 폴더에 넣고 해당 폴더 경로를 매크로에 전달한 다음 디렉터리 목록을 반복합니다(예도 있음).
조사하는 동안 나는 많은 예제가 포함된 훌륭한 문서를 발견하고 사용했습니다.
[1]OpenOffice 매크로 설명통과앤드류 피토니악(독일어도 가능)
[2] 동일한 작성자의 매크로 예:설명 예그리고테스트되지 않은 매크로
그리고 질문/답변.https://ask.libreoffice.org/en/question/29997/how-to-run-a-macro-on-multiple-files-batch/
마지막으로 귀하의 질문과 인내심에 감사드립니다. 매크로 프로그래밍을 다시 시작하는 것은 정말 재미있었고, 기분도 상쾌해졌고 많은 새로운 것을 배웠습니다.