Seite 1 von 1

Geöffnete Dokumente auslesen/Übergabeparameter PDFDruck-Skri

Verfasst: Di, 24.01.2012 19:02
von JK
Hallo,

ich bin mir nicht sicher, dass es hier im richtigen Forum ist, bitte ggf. verschieben. Danke!

Folgende Fragen:
Welche Übergabeparameter (außer "(OUTFILE)") stehen mir zur Verfügung bei der Verwendung eines (eigenen) Skriptes das als PDF-Drucker mittels spadmin als Drucker registriert ist?
Wie kann ich eine Liste der geöffneten Dokumente (vielleicht sogar des gerade aktiven) in OpenOffice mittels eines Shellskriptes bekommen?


Hintergrund:
Wenn ich einen Seriendruck ausführe (über Datei>Drucken und dann die Abfrage nach dem Seriendruck mit Ja bestätige), wird als Titel der erzeugten Postscript-Datei ein String erzeugt ohne Zusammenhang zum ursprünglichen Dateinamen des .odt-Dokumentes, (OUTFILE) ist gleichlautend mit ".pdf" angehängt...

Ich brauche aber irgendwie den Originaldateinamen im Druckskript, oder eine von mir im Dokument setzbare Variable, die auch an die per Seriendruck-Funktion erzeugte ps-Datei weitergegeben wird.

Irgendwelche Ideen?
Danke,
J-K

Re: Geöffnete Dokumente auslesen/Übergabeparameter PDFDruck-

Verfasst: Do, 26.01.2012 20:04
von Frieder D.
Hallo JK
JK hat geschrieben:Hallo,
ich bin mir nicht sicher, dass es hier im richtigen Forum ist, bitte ggf. verschieben. Danke!
Ich denke schon, dass du hier richtig bist.
JK hat geschrieben:Folgende Fragen:
Welche Übergabeparameter (außer "(OUTFILE)") stehen mir zur Verfügung bei der Verwendung eines (eigenen) Skriptes das als PDF-Drucker mittels spadmin als Drucker registriert ist?
Wie kann ich eine Liste der geöffneten Dokumente (vielleicht sogar des gerade aktiven) in OpenOffice mittels eines Shellskriptes bekommen?
Ich weiß zwar nicht, welche Übergabeparameter dir zur Verfügung stehen,aber ich kann dir vielleicht sagen, wie du eine Liste der geöffneten Dokumente, und des aktiven Dokuments bekommst:
du kannst aus deinem Skript ein Makro starten, dass diese Parameter ausließt und sie dann an dein Skript zurück gibt.
Der Aufruf sieht aus der windows-Schell dann so aus:
I:\Program Files (x86)\LibreOffice 3\program>soffice.exe macro:///standard.module3.fnComponent_Names

Und Das Makro(abgewandelte form des Makros aus Andrew Pitonyaks Buch "OpenOffice.org Macros Explained", Kapittel 12.3.2)

Code: Alles auswählen

function fnComponent_Names () As String
  Dim vComps          'Objekt des enumerierten Zugriffs
  Dim vEnumerate      'Enumerationsobjekt
  Dim vComp           'Einzelne Komponente
  Dim sTitle  AS String ' Ausgabe-String
  REM Die Bibliothek Tools wird geladen, weil deren Modul Strings
  REM die Funktion GetFileNameWithoutExtension enthält
  GlobalScope.BasicLibraries.LoadLibrary("Tools")
  
  vComps=StarDesktop.getComponents()   'com.sun.star.container.XEnumerationAccess
  If NOT vComps.hasElements() Then     'Das muss ich nicht tun, aber
    fnComponent_Names= "Es gibt keine Komponenten"  'es zeigt, dass ich es tun kann
    Exit function
  End If
  sTitle =GetFileNameWithoutExtension( StarDesktop.getCurrentComponent.Title )'Aktives dokument

  vEnumerate = vComps.createEnumeration() 'com.sun.star.container.XEnumeration
  
  Do While vEnumerate.hasMoreElements()   'Gibt es noch weitere Elemente?
    vComp = vEnumerate.nextElement()      'Das nächste Element
    REM Der Titel wird nur von Dokument-Komponenten bezogen
    REM Dadurch wird beispielsweise die IDE überschlagen
    If HasUnoInterfaces(vComp, "com.sun.star.frame.XModel") Then
      sTitle= sTitle & Chr(10) & GetFileNameWithoutExtension( vComp.Title ) 
      'Statt Chr(10) kannst du natürlich auch andere Trenner benutzen z.B: ","
    End If
  Loop  
  fnComponent_Names = sTitle
  Rem aufruf deines Skriptes, und übergabe der parameter:
 'Shell("/Pfad zu deinem Spript/Skript.h " & sTitle())'aufruf deines Skriptes, und übergabe der parameter
 Rem Eine andere Möglichkeit wäre, dass du die Namen in eine Tämporäre Datei schreibst,
 Rem und diese Datei dann aus deinem Skript ausließt.
End function
Da ich mich leider nicht so gut mit Shell-Skripten auskenne, weiß ich nicht, ob dir das wirklich hilft.
Ich habe aber gerade herausbekommen, wie man mit einem Python Skript aus der Kommandozeile z.B. den Name des aktuellen Dokuments Auslesen Kann:
Zuerst musst du OO oder LO mit den folgenden Parametern starten:(auch wenn es schon offen ist.)

Code: Alles auswählen

c:\Programe\OpenOffice1.1\program>  soffice "-accept=socket,host=localhost,port=2002;urp;"
Dann Startest du folgendes Skript (Name: bei mir:)

Code: Alles auswählen

#import socket  # only needed on win32-OOo3.0.0
import uno

# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
				"com.sun.star.bridge.UnoUrlResolver", localContext )

# connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager

# get the central desktop object
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)

# access the current writer document
model = desktop.getCurrentComponent()

Title = model.Title

print("%s" % (Title))
Und so startest du das Skript:

Code: Alles auswählen

I:\Program Files (x86)\LibreOffice 3\program> .\python C:\Users\Nansen\Desktop\T
est.py
Es Liefert dir dann den Titel des aktuellen Dokuments auf die Standard-Ausgabe

Gruß Frieder

Re: Geöffnete Dokumente auslesen/Übergabeparameter PDFDruck-

Verfasst: So, 29.01.2012 06:58
von JK
Hallo Frieder D.,

vielen Dank für das python-Skript, funktioniert auch unter Ubuntu Linux 11.10 mit LibreOffice 3.4.4 hervorragend!

Falls noch jemand eine Idee hat, wie ich OOo bzw. LO dazu bewegen kann, beim Seriendruck den ursprünglichen Dokumentnamen weiterzugeben, bin ich für Vorschläge dankbar.

Sorry für das "halbe" Crossposting, dass ich in meiner Ungeduld erstellt habe...

Dank und Gruß,
JK

Re: Geöffnete Dokumente auslesen/Übergabeparameter PDFDruck-

Verfasst: Mo, 30.01.2012 23:32
von JK
Hallo,

leider funktioniert es doch noch nicht so, wie es sollte. Als ich die Erfolgsmeldung gab, hatte ich einfach nur den Code ausgeführt. Das Skript von Hand gestartet funktioniert auch. Wenn das Skript aber als Drucker von LO aufgerufen wird, bekomme ich plötzlich eine Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/jk/bin/LO-aktivesDokument.py", line 15, in <module>
    ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
__main__.NoConnectException: Connector : couldn't connect to socket (Success)
Ich verwende LibreOffice 3.4.4 (unter Ubuntu Linux 11.10 (64bit)). Zum Testen folgendes Skript

Code: Alles auswählen

#~/bin/aktives-LO-Dokument-Drucker.sh
#!/bin/bash

skriptpfad=`readlink -f "$0"`
arbeitspfad=$(dirname "$skriptpfad")

soffice "--accept=socket,host=localhost,port=2002;urp;"
offenes_Writer_Dokument=$("$arbeitspfad"/LO-aktivesDokument.py)
soffice "--unaccept=socket,host=localhost,port=2002;urp;"

echo $offenes_Writer_Dokument
mit der Druckerverwaltung (spadmin) als Drucker hinzufügen (PDF-Konverter) und dann ein Writer-Dokument mit diesem "Drucker" drucken. Es ist nicht notwendig einen Serienbrief zu drucken, um den Fehler zu bekommen…

Kann da jemand helfen?

Vielen Dank schon mal,
JK