TL; DR版本-我需要使用LibreOffice以编程方式将密码添加到.docx / .xlsx / .pptx文件,并且它不起作用,也不会报告任何错误,我添加密码的请求很简单会被忽略,并保存同一文件的无密码版本。
深度: 我正在尝试编写脚本,以使用LibreOffice对现有的.docx / .xlsx / .pptx文件进行密码保护。 我使用的是Windows 8.1 64位专业版上的最新版本的64位LibreOffice 6.2.5.2。 虽然我可以通过UI手动进行操作-具体来说,我打开“普通”文档,执行“另存为”,然后勾选“使用密码保存”,然后在其中输入密码,但我无法通过任何方式使它起作用自动化。我一直在尝试通过Python / Uno,但没有收获。尽管下面的代码可以正确打开并保存文档,但是我添加密码的尝试被完全忽略了。奇怪的是,当我这样做时,文件大小从12kb缩小到9kb。
这是我的代码:
import socket
import uno
import sys
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
from com.sun.star.beans import PropertyValue
properties=[]
oDocB = desktop.loadComponentFromURL ("file:///C:/Docs/PlainDoc.docx","_blank",0, tuple(properties) )
sp=[]
sp1=PropertyValue()
sp1.Name='FilterName'
sp1.Value='MS Word 2007 XML'
sp.append(sp1)
sp2=PropertyValue()
sp2.Name='Password'
sp2.Value='secret'
sp.append(sp2)
oDocB.storeToURL("file:///C:/Docs/PasswordDoc.docx",sp)
oDocB.dispose()
使用Python / Uno打开受密码保护的文件时,我取得了不错的成绩,但是我无法获得它来保护以前未受保护的文档。我尝试启用宏记录器并记录我的操作-它记录了以下LibreOffice BASIC代码:
sub SaveDoc
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 ----------------------------------------------------------------------
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Docs/PasswordDoc.docx"
args1(1).Name = "FilterName"
args1(1).Value = "MS Word 2007 XML"
args1(2).Name = "EncryptionData"
args1(2).Value = Array(Array("OOXPassword","secret"))
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
end sub
即使我尝试运行它,它也...保存了不受保护的文档,没有密码加密。我什至尝试将上面的宏转换为等效的Python代码,但均无济于事。我没有任何错误,它根本不能保护文档。
最后,出于绝望,我什至尝试了不包含LibreOffice的其他方法,例如,按照以下现有StackOverflow问题使用Apache POI库:
Python or LibreOffice Save xlsx file encrypted with password
...但是我只是收到一条错误消息,提示“错误:找不到或加载主类org.python.util.jython”。我尝试升级我的JDK,调整示例中使用的路径,即“智能”运行,但仍然没有乐趣。我怀疑上面的错误很难解决,但是我不是Java开发人员,也没有这方面的经验。
有人可以解决吗?您是否有一些LibreOffice代码可以做到这一点(密码保护的.docx / .xlsx / .pptx文件)?还是OpenOffice,对于使用哪个软件包我并不珍惜。或者完全是其他东西!
注意:我感谢使用完整版Microsoft Office做到这一点很简单,但是由于Microsoft的许可限制,该项目完全无法使用-我必须使用其他方法。
答案 0 :(得分:0)
以下示例摘自有用的宏信息的第40页(文件第56页) 对于Andrew Pitonyak(http://www.pitonyak.org/AndrewMacro.odt)的OpenOffice.org 。该文档指向OpenOffice.org Basic,但通常也适用于LibreOffice。该示例与宏记录器版本的不同之处主要在于它使用了已记录的API,而不是调度调用。
5.8.3。使用密码保存文档
要使用密码保存文档,必须设置“密码” 属性。
代码5.19: 使用密码保存文档。
Sub SaveDocumentWithPassword 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()) End Sub
参数名称区分大小写,因此“密码”将无效。