Lade...
 

Dokumentation des Druckens über die OLE-Schnittstelle

Dokumentation des Druckens über die OLE - Schnittstelle

Inhaltverzeichnis:
  1. Setzen von Kopf- und Fußzeilen
  2. Einfügen von allgemeine Wordtexten
  3. Einfügen von Abschnittswechseln und neuen Kopfzeilen
  4. Weiter Ausgabemöglichkeiten
  5. Druckmöglichkeiten / Vorschau
Weitere Links:

Beim Drucken über die OLE - Schnittstelle werden verstärkt VBA - Befehle verwendet. Da die am Drucken beteiligten Aufrufe weder in der Instantview® noch in der CyberEnterprise® Dokumentation beschrieben sind, wird sich dieser Abschnitt damit beschäftigen. Außerdem wird auf die Unterschiede zu der alten Druckmethode eingegangen.

So beginnt das neue Drucken nicht mit dem Erzeugen eines CXS_Dokumentes, in welches die Bausteine eingefügt werden, sondern jetzt wird direkt ein Wordobjekt angelegt. Diesem wird anschließend eine Formatvorlage mit den gleichen Formaten zugewiesen, wie sie auch in den Bausteinen und weiteren, am Druck beteiligten, Wordobjekten in der Datenbank verwendet werden. (siehe Skript Druckschulung)

// Create new word object
CreateTransObject(CX_COM_OBJECT) -> objectClip
"Word.Document" objectClip Call(CreateFromProgID)

strDotPath applicationClip Call(GetAddIns) Call(Add)
applicationClip
Call(Lock)
// format settings
"-1" Integer objectClip Call(PutUpdateStylesOnOpen)
strDotPath objectClip
Call(PutAttachedTemplate)

 

1. Setzen von Kopf- und Fußzeilen

Als nächsten Schritt werden die Kopf- und Fußzeilen für das Dokument gesetzt. Da wir in der Regel unterschiedlich Köpfe auf der ersten und den Folgeseiten verwenden, müssen wir dies auch dem Wordobjekt zuweisen.

// Set different page headers
(-1) objectClip Dup Call(Activate) Call(GetPageSetup) Call(PutDifferentFirstPageHeaderFooter)

Nun können wir zum Beispiel die Fußzeile setzen. Das oleObj ist das Wordobjekt, welches als Fußzeile eingefügt werden soll. Der auskommentierte Teil in der ersten Zeile steht für das Sperren der Felder, wodurch ihr Inhalt nicht mehr aktualisiert werden kann. Da die Fußzeile aber nur das Feld der Seitenzahl besitzt, dürfen wir diesen Code hier nicht ausführen. Das Feld würde sich sonst nicht aktualisieren und unabhängig von der Seite stets '1' anzeigt. Der Befehl Call(GetContent) markiert den gesamten Inhalt, welchen wir über Call(Copy) in den Zwischenspeicher kopieren. Nun müssen wir den kopierten Teil nur noch einfügen.

Ein Worddokument kann sich in mehrere (mind. einen) Abschnitte aufteilen und über Call(GetSections) Call(GetLast) sprechen wir den Letzten, also den aktuellen Teil, an. Da wir zuvor das Flag 'DifferentFirstPageHeaderFooter' gesetzt haben, müssen wir jetzt zwei verschiedene Fußelemente ansprechen. Call(GetFooters) Call(Item) mit den Übergabeparameter '2' spricht die erste Seite und der Parameter '1' die folgenden Seiten an. Der Inhalt aus der Zwischenablage wird dann in beiden Fällen über Call(GetRange) Call(Paste) eingefügt.

oleObj Call(Activate) oleObj Call(GetContent) /*Dup Call(GetFields) "-1" Swap Call(PutLocked)*/ Call(Copy)
// get page footer for page 1 + 1...1+n
2 objectClip Dup Call(Activate) Call(GetSections) Call(GetLast) Call(GetHeaders) Call(Item) Call(GetRange) Call(Paste)
1 objectClip Dup Call(Activate) Call(GetSections) Call(GetLast) Call(GetFooters) Call(Item) Call(GetRange) Call(Paste)

Das selbe passiert auch beim setzen der Kopfzeilen mit dem Unterschied, dass die eingefügten Inhalte nicht identisch sind und im Aufruf der die Anweisung Call(GetFooters) durch Call(GetHeaders) ersetzt wird.

2. Einfügen von allgemeine Wordtexten

Das einfügen der weiteren Inhalte erfolgt ähnlich einfach. Wir haben ein Worddokument, bei dem wir die Felder sperren und den gesamten Inhalt kopieren. Nun springen wir an die aktuelle Stelle in unserem, zu druckendem, Wordobjekt (Call(GetApplication) Call(GetSelection)) und merken uns diese in der Variablen 'Selektion'. Der Aufruf 'Call(Paste)' fügt nach wie vor den Inhalt aus der Zwischenablage ein.

 

DropAll
// Copy document component
tmpOleObj Du Call(Activate) Call(GetContent) Du Call(GetFields) "-1" Swap Call(PutLocked) Call(Copy)
// Jump into the document
objectClip Dup Call(Activate) Call(GetApplication) Call(GetSelection) -> selection

// paste component into document
selection Call(Paste)

3. Einfügen von Abschnittswechseln und neuen Kopfzeilen

Mit den bisher gezeigten Befehlen könnte man zwar schon ein Formular erzeugen, aber zum Beispiel der Ausgabe von längeren Listen, mit einen auf jeder Seite wiederholenden Listenüberschrift, würde man an seine Grenzen stoßen. Um dies zu realisieren, müssen wir einen neuen Abschnitt einfügen, damit wir neue Kopfzeilen setzen können. Zuerst springen wir wieder an die aktuelle Position im Dokument und merken uns diese. Über die Variable pageBreakType  übergeben wir den Typ des Abschnittswechsels. Call(GetSections) Call(Add) fügt den einfachen Wechsel mit Seitenumbruch ein. Dagegen wird im anderen Case- Fall '1' ein laufender Abschnittswechsel erzeugt.

objectClip Call(GetApplication) Call(GetSelection) -> selection
pageBreakType
case
        0          :  selection Call(GetSections) Call(Add) Drop
                       TRUE -> beginOfNewPage
        1          :  selection Dup Call(GetRange) Swap Call(GetSections) 0 Swap Call(Add) Drop
endCase

Nun können wir mitten im Dokument wieder neue Kopfzeilen setzen. Zum Beispiel können wir neben dem bisherigen Inhalt des Kopfes auch noch die Listenüberschrift ausgeben, welche dann automatisch auf jeder Seite wiederholt wird. Bevor wir dies tun können müssen aber noch eine Kleinigkeit beachten. Da die Köpfe auch abschnittsübergreifend miteinander Verbunden sind, würde jede Änderungen auch eine Änderung der bisherigen Köpfe bewirken. Somit müssen wir die Verbindung erst lösen.

objectClip Call(GetSections) Call(GetLast) Call(GetHeaders) 1 Swap Call(Item) -> tmpHeaderItem1
0 tmpHeaderItem1 Call(PutLinkToPrevious)

 

4. Weitere Ausgabemöglichkeiten

- direkte Ausgabe von einfachen Texten
         "Beispieltext" selection Call(PutText)

- Ausgabe eines Zeilenumbruches
        selection Call(TypeParagraph)

5. Druckmöglichkeiten / Vorschau

Vorschau
Die Vorschau von Word kann über den Befehl Call(PrintPreview) generiert werden, nach dem wir das erzeugte Objekt geöffnet haben. Anschließend können wir manuell noch einige Einstellungen vornehmen. So wird in der nächsten Zeile der Zoom auf 100% justiert.

objectClip Dup Call(CX_Open) Call(PrintPreview)
objectClip
Call(GetApplication) Call(GetActiveWindow) Call(GetActivePane) Call(GetView) Call(GetZoom) 100 Swap Call(PutPercentage)

Einfaches Drucken
Beim einfachen Drucken können wir das Worddruckdialogfenster benutzen. Der Benutzer kann dann, wie beim "normalen" Worddruck auch, weiter Einstellungen (Seiten Von-Bis, Kopieanzahl, etc.) vornehmen, bevor er den Druck auslöst. Da Word sich hierdurch versucht zu öffnen, machen wir es in der nächsten Zeile gleich wieder unsichtbar.

88 objectClip Dup Call(Activate) Call(GetApplication) Call(GetDialogs) Call(Item) Call(Show)
0 objectClip Call(GetApplication) Call(PutVisible)

Erzeugen einer PDF/Drucken mehrerer Kopien
Wollen wir das Worddokument jedoch als PDF speichern/archivieren, dann müssen wir über einen anderen Druckaufruf gehen, um verschiedene Informationen an Word übergeben zu können. In den ersten Zeilen tauschen wir den Drucker aus, falls FinePrint der Standarddrucker ist, da das Drucken sonst über eine Zwischenfenster erfolgt und die ps-Datei nicht rechtzeitig (vor dem Starten der Batch-Datei) fertig gestellt wird. Als nächsten Schritt starten wir den Ausdruck (Call(PrintOut)). Dieser Aufruf benötigt allerhand Übergabeparameter, welche in der Tabelle 'Parameterliste' beschrieben sind. Das Erzeugen der PDF-Datei aus der ps-Datei erfolgt dann nach wie vor über die Batch-Datei.

objectClip Call(GetApplication) Call(GetActivePrinter) "FinePrint" StringFind if
{
   "Generic PostScript Printer" objectClip Call(GetApplication) Call(PutActivePrinter)
}

DropAll
t  f  f  postscriptFileName  "1" "100" f  t  "" f  t  objectClip  Call(PrintOut)

 

Parameterliste

Stack - Top PrintToFile Steuert den Druck in eine Datei  
Stack - Top-1 PageType    
  Pages   "1;3;5-7"
  Copies Anzahl der Kopien "2"
  Item    
  To Startseitenzahl "1"
  From Endseitenzahl "100"
  OutputFileName Wenn das Flag PrintToFile auf 'TRUE' gesetzt wurde, kann man hier den Dateiname angeben "C:\fileName.ps"
  Range    
  Background    
Stack - Top-n Append    

Beim Drucken einer beliebigen Anzahl von Kopien erfolgt über die selbe Methode und dem Setzen des Flags 'Copies'. Hierbei sollte man zwei Dinge beachten. Zum einen wird die Anzahl als String übergeben und zum Zweiten sollten die Flags 'PrintToFile' und 'OutputFileName' nicht gesetzt sein, da der Ausdruck sonst in eine Datei geleitet wird.