2015-06-15 38 views
0

我想知道是否有可能創建一個標準文件對話框,通過python宏保存pdf。我試着寫在此基礎上過時的文檔一些代碼:wiki.openoffice.org,但執行後的LibreOffice崩潰:LibreOffice - 如何通過python宏創建文件對話框?

import os 
import uno 
import sys 
import traceback 
from com.sun.star.ui.dialogs.TemplateDescription import FILESAVE_SIMPLE 

def file_dialog(): 
    try: 
     oCtx = uno.getComponentContext() 
     oServiceManager = oCtx.getServiceManager() 

     oFilePicker = oServiceManager.createInstanceWithArgumentsAndContext(
       'com.sun.star.ui.dialogs.FilePicker', 
       (FILESAVE_SIMPLE,), 
       oCtx 
      ) 

     oFilePicker.Title = 'Export as' 

     #oDisp = oFilePicker.Text 

     oFilePicker.execute() 

    except: 
     pass 
     #oDisp = traceback.format_exc(sys.exc_info()[2]) 

在我需要通過所選擇的路徑寫入文件末尾,但oDisp = oFilePicker.Text回報:(<type 'exceptions.AttributeError'>。此外有沒有辦法設置文件類型?

有沒有人有經驗呢?

回答

1

我在oFilePicker對象上使用了Xray。有幾個有趣的方法叫做setCurrentFilter和appendFilterGroup。只是基於名稱,它們可能用於過濾哪些文件類型可見。不幸的是我不確定如何使用它們。

此外,藉助Xray,我確定文本不是oFilePicker對象的方法或屬性。我不確定代碼片段試圖在那裏做什麼?如果檢索文件路徑,1)需要在.execute之後完成,2)選定的文件路徑以字符串數組存儲,所以路徑必須從數組中取出。我在OpenOffice中的大部分工作都在StarBasic中;下面是打印由用戶選擇的文件路徑的基本工作示例:

Sub TestFilePicker 
    oFilePickerDlg = createUnoService("com.sun.star.ui.dialogs.FilePicker") 
    oFilePickerDlg.setTitle("My test title") 

    If oFilePickerDlg.execute() > 0 Then 
     Print ConvertFromURL(oFilePickerDlg.Files(0)) 
    End If 

End Sub 
+0

謝謝您的回答Lyrl + 1,但不幸的是我正在尋找一個python解決方案。 – p2or

+0

將'oDisp ='行移到* .execute'行之後*。這是我100%確定的。然後將'.Text'改爲'.Files(0)' - 這部分我有點不確定,我不確定python如何調用數組。但是,作爲一個python用戶,你肯定會明白其意圖是將名爲'Files'的數組中的第一個條目分配給變量'oDisp',並知道正確的Python代碼。 – Lyrl

1

給予和接受(因爲這個問題是交叉貼!)答案here

import uno 
from com.sun.star.beans import PropertyValue 

#shortcut: 
createUnoService = (
     XSCRIPTCONTEXT 
     .getComponentContext() 
     .getServiceManager() 
     .createInstance 
        ) 

def pypdf_test(): 

    desktop = XSCRIPTCONTEXT.getDesktop() 
    doc = desktop.getCurrentComponent() 

    # filter data 
    fdata = [] 
    fdata1 = PropertyValue() 
    fdata1.Name = "SelectPdfVersion" 
    fdata1.Value = 1 
    fdata2 = PropertyValue() 
    fdata2.Name = "Quality" 
    fdata2.Value = 100 
    fdata.append(fdata1) 
    fdata.append(fdata2) 

    args = [] 
    arg1 = PropertyValue() 
    arg1.Name = "FilterName" 
    arg1.Value = "writer_web_pdf_Export" 
    arg2 = PropertyValue() 
    arg2.Name = "FilterData" 
    arg2.Value = uno.Any("[]com.sun.star.beans.PropertyValue", tuple(fdata)) 
    args.append(arg1) 
    args.append(arg2) 
    fileurl = FilePicker() 
    if fileurl:   
     doc.storeToURL(fileurl, tuple(args)) 

def FilePicker(path=None, mode=1): 
    """ 
    Datei öffnen: `mode in (0, 6, 7, 8, 9)` 
    Datei Schreiben `mode in (1, 2, 3, 4, 5, 10)` 
    see: ('''http://api.libreoffice.org/docs/idl/ref/ 
      namespacecom_1_1sun_1_1star_1_1ui_1_1 
      dialogs_1_1TemplateDescription.html''') 
    """ 

    filepicker = createUnoService("com.sun.star.ui.dialogs.OfficeFilePicker") 
    if path: 
     filepicker.setDisplayDirectory(path) 
    filepicker.initialize((mode,)) 
    if filepicker.execute(): 
     return filepicker.getFiles()[0] 
+0

通知Karolus - 他同意。如果你更多地解釋代碼,特別是對於德國以外的用戶**,我會接受並提高你的答案。 – p2or

+0

解釋什麼? 你的問題是「如何調用內置'FileDialog',用於PDF導出。 該代碼顯示了PDF屬性和過濾器的設置,調用'FileDialog'並返回給定的名稱(如果未取消) 這個版本是爲LibreOffice編寫的,但也適用於Apache OpenOffice。 – ngulam

+0

這不是一個論壇,它解釋了代碼的工作原理是一個很好的實踐,引用:'我們正在尋找提供一些解釋和上下文的長答案。不要只給出一個單行的答案,解釋爲什麼你的答案是正確的,最好是引用。不包括解釋的答案可能會被刪除。' – p2or