6.5 Inhalt dieses LOOPs ausdrucken

[gesichtete Version][gesichtete Version]
Zeile 16: Zeile 16:
</p>
</p>
<p>
<p>
So geht es halt auch, dauert nur etwas länger. Und wer vielleicht aus dem Bereich der Webprogrammierung schon immer mal ein praktisches Beispiel für DOM-Manipulation im Browser haben wollte: Das Skript macht ausgibig Gebrauch davon!
So geht es halt auch, dauert nur etwas länger.
</p>
</p>
<br />
== DOM-Manipulation im Browser ==
<p>
Und wer vielleicht aus dem Bereich der Webprogrammierung schon immer mal ein praktisches Beispiel für DOM-Manipulation im Browser haben wollte: Das Skript macht ausgibig Gebrauch davon!
</p>
<br />
== Download ==
[[:File:LOOP-Content-from-IE-to-Word.zip]]
<br />
== AutoIt-Quellcode ==


<loop_area type="sourcecode">
<loop_area type="sourcecode">

Version vom 18. November 2014, 10:42 Uhr

Inhalt dieses LOOPs ausdrucken

Die erste Wahl beim Drucken des Inhalts dieses LOOPs geht in jedem Fall über die PDF-Version dieses Skripts.

Wer etwas mehr Wert darauf legt, dass der Ausdruck möglichst exakt so aussieht, wie die Inhalte hier im Browser, der kann zu dieser Bastel-Lösung greifen.


Bastel-Lösung

Die Bastel-Lösung ist aus der Not heraus entstanden, weil die PDF-Export-Funktion in einem anderen LOOP aus unerklärlicher Weise nicht funktionierte, aber dennoch kurzfristig ein PDF erstellt werden musste.

Das folgende AutoIt-Skript ruft nachheinander alle Seiten des Inhaltsverzeichnisses im Browser auf, macht einen Screenshot von den verschiedenen Teilen der Seite, und fügt diese in ein Word-Dokument ein.

So geht es halt auch, dauert nur etwas länger.


DOM-Manipulation im Browser

Und wer vielleicht aus dem Bereich der Webprogrammierung schon immer mal ein praktisches Beispiel für DOM-Manipulation im Browser haben wollte: Das Skript macht ausgibig Gebrauch davon!


Download

File:LOOP-Content-from-IE-to-Word.zip

AutoIt-Quellcode

Code
#include <INet.au3>
#include <_HTML.au3>

#include <IE.au3>
#include <Word.au3>

#include <MsgBoxConstants.au3>

; ================================================================
; AutoIt-Skript
; zum Extrahieren des Content eines LOOP (http://loop.oncampus.de).
; ----------------------------------------------------------------
; Andreas Wilkens im November 2014
; aw@dozaw.de
; ----------------------------------------------------------------
; Die einzelnen Webseiten werden im Internet Explorer (IE) dargestellt
; und mit Hilfe von FireShot wird ein Screenshot von bestimmten
; Seitenteilen angefertigt. Dabei werden alle Nicht-Content-Inhalte
; zuvor per DOM-Manipulation im Browser ausgeblendet (Navigationselemente,
; Header, Footer, Sidebar links und rechts)
; Der Screenshot wird über die Windows-Zwischenablage in ein
; Word-Dokument eingefügt.
; Der User kann das Word-Dokument am Ende nach belieben ändern (z.B.
; formatieren) und abspeichern, oder auch als PDF exportieren.
; ================================================================
;
; Diese Software ist noch im Teststadium.
; Der Autor übernimmt keine Garantie für die Funktionsfähigkeit.
; Der Autor haftet nicht für Schäden, die durch die Ausführung dieser
; Software entstehen.
; Jegliche Verwendung geschieht auf eigene Gefahr.
;
; ================================================================
; Diese Software wurde entwickelt und getestet unter
; Microsoft Windows 7 Professional, 64 Bit
; AutoIt Version 3.3.12.0
; Internet Explorer Version 11.0.9600.17420
; FireShot for Internet Explorer v.0.98.63
; Microsoft Word Version 14.0.7128.5000, 64 Bit, aus dem
; Microsoft Office Professional Plus 2010 Paket
; ================================================================
;
; Diese Software ist freie Software.
; Sie darf beliebig verwendet, verändert, veröffentlicht und
; weitergegeben werden.
;
; ================================================================

Opt("SendKeyDelay", 0)

; Mit ESC wird die Ausführung des Skripts sofort beendet.
; Es erfolgt keine weitere Rückfrage.
HotKeySet("{ESC}", "Terminate")

Func Terminate()
   MsgBox( 0, "", "Skriptausführung beendet." )
   Exit
EndFunc   ;==>Terminate

; -------------------------------------------------------------------------
; Wenn $VERBOSE = True gesetzt ist, dann erfolgen beim Start des Skripts
; eine Reihe von Rückfragen und Auswahlmöglichkeiten für den User. Zum
; Testen sei dies unbedingt empfohlen!
; Bei $VERBOSE = False fängt das Skript sofort an zu arbeiten. Es werden
; dann die vorgegebenen Belegungen der Variablen unverändert übernommen.

Local $VERBOSE = True

; -------------------------------------------------------------------------
; Noch einige Variablen, die später benutzt werden.

Local $oIE			; Für den Internet Explorer
Local $hIE_Window_Handle

Local $oWord		; Für Word
Local $hWord_Window_Handle

Local $TIMEOUT_SECONDS = 3
Local $result					; Für Rückgabewerte aus MsgBox oder InputBox

; -------------------------------------------------------------------------

If ($VERBOSE) Then
   $result = MsgBox( $MB_OKCANCEL, "Word schließen","Es darf keine Microsoft Word Anwendung geöffnet sein."  & @CRLF & @CRLF & "Gegebenenfalls bitte jetzt alle aktiven Word-Instazen schließen." )
   If ( ($result <> $IDOK) And ($result <> $IDTIMEOUT) ) Then
	  ; User hat den Cancel-Button gedrückt.
	  Exit
   EndIf
EndIf

; -------------------------------------------------------------------------
; Um alle Links auf dieser Seite geht es.
; Üblicherweise ist dies eine LOOP-Seite mit dem TOC (Table of Contents)

Local $sURL_TOC = "http://vfhcab.oncampus.de/loop/MediaWiki:Loop_toc"

If ($VERBOSE) Then
   $sURL_TOC = InputBox("", "Welche Webseite ist der Ausgangspunkt?" & @CRLF & @CRLF & "Üblicherweise ist dies eine LOOP-Seite mit dem 'Table of Contents'",$sURL_TOC, "", 500)
   If (@error <> 0) Then
	  ; User hat den Cancel-Button gedrückt.
	  ; Skript wird beendet.
	  Exit
   EndIf
EndIf

; -------------------------------------------------------------------------

If ($VERBOSE) Then
   $result = MsgBox( $MB_OKCANCEL, "IE vorbereiten","Es muss jetzt bereits ein Fenster des Internet Explorers geöffnet sein. Du als User musst dieses Fenster öffnen." & @CRLF & @CRLF & "FireShot muss als AddOn im Internet Explorer installiert sein." & @CRLF & "FireShot muss eingestellt sein auf" & @CRLF & "--> Capture visible Area and" & @CRLF & "--> Copy to Clipboard" & @CRLF & @CRLF & "Bitte FireShot unbedingt testen, da es direkt nach der Installation viele Rückfragen hat. Bei allen Rückfragen mit 'Remember my decision' dafür sorgen, dass sie nicht wieder erscheinen." & @CRLF & @CRLF & "Die LOOP-Seite " & $sURL_TOC & @CRLF & "muss einmal im Internet Explorer geöffnet sein." & @CRLF & "Mit Benutzernamen und Passwort anmelden, falls erforderlich." & @CRLF & "Linke und rechte Sidebar ausblenden.")
   If ( ($result <> $IDOK) And ($result <> $IDTIMEOUT) ) Then
	  ; User hat den Cancel-Button gedrückt.
	  Exit
   EndIf
EndIf

; -------------------------------------------------------------------------

If ($VERBOSE) Then
   $result = MsgBox( $MB_OKCANCEL, "","Durch drücken der ESC-Taste wird die Ausführung dieses Skripts sofort und ohne Rückfragen beendet.")
   If ( ($result <> $IDOK) And ($result <> $IDTIMEOUT) ) Then
	  ; User hat den Cancel-Button gedrückt.
	  Exit
   EndIf
EndIf

; -------------------------------------------------------------------------
; Alle Links dieser Seite ermitteln.

Local $HTML_SOURCE = _INetGetSource($sURL_TOC)

Dim $ALL_LINKS = _HTML_GetAllLinks($HTML_SOURCE)

If Not IsArray($ALL_LINKS) Then
   MsgBox( 0, "Fehler", "Es ist ein Fehler beim Ermitteln der Links aufgetreten" & @CRLF & @CRLF & sURL_TOC )
   ; Das Skript wird beendet
   Exit
EndIf

; ================================================================
; Jetzt stehen alle ermittelten Links in $ALL_LINKS.
; Aber es sind noch Links für die Navigation etc. dabei.
; ================================================================

; ----------------------------------------------------------------
; Ein wenig Information ausgeben.

If ($VERBOSE) Then
   $result = MsgBox( $MB_OKCANCEL, "Anzahl Links","Auf der Webseite" & @LF & $sURL_TOC & @LF & "gibt es insgesamt" & @LF & UBound($ALL_LINKS) & " Links" )
   If ( ($result <> $IDOK) And ($result <> $IDTIMEOUT) ) Then
	  ; User hat den Cancel-Button gedrückt.
	  Exit
   EndIf
EndIf

; ----------------------------------------------------------------
; $START_NO enthält den Index des ersten Links im Array $ALL_LINKS.
; Der Wert dieser Variablen definiert, bei welchem Link später
; mit dem Extrahieren des Content begonnen wird.

Local $START_NO = 4

If ($VERBOSE) Then
   Local $sTEXT = "Dies sind die ersten Links auf der Seite '" & $sURL_TOC & "'" & @LF
   For $i = 0 To 32
	  If ($i < UBound($ALL_LINKS)) Then
		 $sTEXT = $sTEXT & @LF & $i & " : " & $ALL_LINKS[$i]
	  EndIf
   Next
   $sTEXT = $sTEXT & @LF & @LF & "Bei welcher Link-Nr. soll gestartet werden? (Die Navigations-Links zu Beginn sollten übersprungen werden.)"

   $START_NO = InputBox("Start-Nr.",$sTEXT,$START_NO,"",800,600)

   If (@error <> 0) Then
	  ; User hat den Cancel-Button gedrückt.
	  ; Skript wird beendet.
	  Exit
   EndIf
EndIf

; ----------------------------------------------------------------
; $END_NO enthält den Index des letzten Links im Array $ALL_LINKS.
; Der Wert dieser Variablen definiert, bei welchem Link später
; das Extrahieren des Content beendet wird.

; Local $END_NO = UBound($ALL_LINKS) - 1
Local $END_NO = $START_NO + 2

If ($VERBOSE) Then
   Local $sTEXT = ""
   Local $x
   If (UBound($ALL_LINKS) >= 33) Then
	  $x = UBound($ALL_LINKS) - 33
   Else
	  $x = 0
   EndIf
   For $i = (UBound($ALL_LINKS) - 1) To $x Step -1
	  $sTEXT = $i & " : " & $ALL_LINKS[$i] & @LF & $sTEXT
   Next
   $sTEXT = $sTEXT & @LF & @LF & "Bei welcher Link-Nr. soll beendet werden? (Die Navigations-Links am Ende sollten nicht mit verarbeitet werden.)"

   $END_NO = InputBox("End-Nr.",$sTEXT,$END_NO,"",800,600)

   If (@error <> 0) Then
	  ; User hat den Cancel-Button gedrückt.
	  ; Skript wird beendet.
	  Exit
   EndIf
EndIf

; -------------------------------------------------------------------------

If ($VERBOSE) Then
   $result = MsgBox( $MB_OKCANCEL, "","Die Verarbeitung startet jetzt." & @CRLF & @CRLF & "Dabei klickt das Skript auf den FireShot-Button im Internet Explorer." & @CRLF & "Die Bildschirmkoordinaten für den MouseClick sind im Skript hinterlegt und müssen ggf. angepasst werden. Siehe:" & @CRLF & @CRLF & "Local $FireShot_X = 80" & @CRLF & "Local $FireShot_Y = 66" & @CRLF )
   If ( ($result <> $IDOK) And ($result <> $IDTIMEOUT) ) Then
	  ; User hat den Cancel-Button gedrückt.
	  Exit
   EndIf
EndIf

; ================================================================
; Jetzt haben wir alle Links in dem Array $ALL_LINKS.
; $START_NO gibt an, bei welchem Array-Index in $ALL_LINKS wir starten.
; $END_NO gibt an, bei welchem Array-Index in $ALL_LINKS wir enden.
; Dazwischen werden alle Links verarbeitet.
; ================================================================

; -------------------------------------------------------------------------
; Word starten

$oWord = _Word_Create()
$hWord_Window_Handle = WinGetHandle("Microsoft Word", "")

; Für Word-Properties siehe:
; http://msdn.microsoft.com/en-us/library/ff841712%28v=office.14%29.aspx

; Word auf dem Bildschirm positionieren
WinMove( $hWord_Window_Handle, "", 900, 0 )

; Einige Vorbereitungen in Word treffen
Send( "^n" )		; STRG n   -->   Neues Dokument in Word
Send( "^e" )		; STRG e   -->   Absatz zentrieren

; ================================================================
; Jetzt beginnt die Verarbeitung der gewünschten Links.
; ================================================================

; Schleife über alle zu verarbeitenden Links
For $URL_NO = $START_NO To $END_NO

   WinActivate( $hWord_Window_Handle, "" )		; Dem Word-Fenster den Fokus geben.

   Send( "^{Enter}" )		; STRG Enter   -->   Neue Seite in Word

   ; Internet Explorer aufrufen mit URL dieses FOR-Durchlaufs
   $oIE = _IECreate( $ALL_LINKS[ $URL_NO ], 0 )
   $hIE_Window_Handle = _IEPropertyGet( $oIE, "hwnd" )

   ; Das Fenster des Internet Explorers in der linken oberen Ecke des
   ; Bildschirms positionieren, damit der Mausklick auf den FireShot-Button
   ; weiter unten auch mit den korrekten Koordinaten ausgeführt wird.
   ; (FireShot hat im IE aktuell keinen Shortcut, es muss also zwingend ein
   ; Mausklick erfolgen)

   _IEPropertySet( $oIE, "left", 0 )
   _IEPropertySet( $oIE, "top", 0 )

   ; Die Breite des Fensters entspricht der Breite des Content.
   ; Das ist wichtig, da FireShot genau in der Breite des Fensterinhalts aufnimmt.

   _IEPropertySet( $oIE, "width", 873 )

   ; Die Höhe des Fensters ist bewusst klein gewählt. FireShot scrollt bei der Aufnahme
   ; automatisch und baut das Bild korrekt zusammen.
   ; Wäre die Höhe hier großer eingestellt, als der Content lang ist, so würde unnötig
   ; viel leerer Bildschirn aufgenommen werden.
   ; Vorsicht: weniger als 150 macht hier keinen Sinn.
   ; Wenn viele Symbolleisten etc. eingeblendet sind, kann auch ein deutlich größerer
   ; Wert nötig sein.

   _IEPropertySet( $oIE, "height", 450 )

   ; Über diese Koordinaten klickt die Maus auf den FireShot-Button im Internet Explorer.
   ; Die Koordinaten sind relativ zur linken oberen Ecke des Bildschirms!
   Local $FireShot_X = 80
   Local $FireShot_Y = 66

   ; Kurz warten, bis das Bild im Browser korrekt aufgebaut ist.
   Sleep( 500 )

   ; ----------------------------------------------------------------
   ; ----------------------------------------------------------------
   ; Ab hier erfolgt die DOM-Manipulation im Browser.
   ; ----------------------------------------------------------------
   ; ----------------------------------------------------------------

   ; Alle div's entfernen, die nicht mit in den Screenshot sollen.
   Local $divToBeDeleted = ["header", "navbar1", "navbar2", "pageaudio", "sidebar_left", "sidebar_right", "content_bar", "content_footer", "footer"]
   For $j = 0 To (UBound($divToBeDeleted) - 1)
     $oDiv = _IEGetObjById($oIE, $divToBeDeleted[$j])	; Dies ist das betreffende div.
     $oDiv.outerhtml = ""								; So wird sein Inhalt aus der Browseranzeige entfernt:
   Next

   ; Einige weitere Variablen, die zum Ermitteln des Contents nötig sind.
   Local $sTitle = ""		; Nimmt die ermittelte Seitenüberschrift der URL dieses FOR-Durchlaufs auf.
   Local $oDiv;				; Nimmt div-Container auf, um daraus den Content zu ermitteln.
   Local $oChildNodes;		; Nimmt alle ChildNodes eines div-Containers auf.
   Local $oNode;			; Nimmt genau einen Node auf.

   ; Die folgenden drei Zeilen dienen dazu, dem Array $HTMLParts die richtige Größe zu geben.
   $oDiv = _IEGetObjById($oIE, "mw-content-text")
   $oChildNodes = $oDiv.childNodes				; Aus dem div alle childNodes ermitteln
   Local $HTMLParts[ $oChildNodes.length + 1 ]	; Für Überschriften und Nodes, die später als Screenshot in Word landen

   Local $part = 0;

   ; ----------------------------------------------------------------
   ; Jetzt den Seitentitel ermitteln

   ; Bei "alten" LOOPs steht die Überschrift der Seite in diesem div
   $oDiv = _IEGetObjById($oIE, "content_body")

   $oChildNodes = $oDiv.childNodes		; Aus dem div alle childNodes ermitteln

   For $oNode in $oChildNodes

	  If (StringInStr( $oNode.outerhtml, '<h1>' ) = 1) or (StringInStr( $oNode.outerhtml, '<h2>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h3>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h4>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h5>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h6>' ) = 1) Then

		 $sTitle = $oNode.innertext
		 $HTMLParts[$part] = $sTitle
		 $part += 1

		 ; Den Inhalt dieses Nodes löschen, da er nicht ein zweites Mal
		 ; verarbeitet werden darf.
		 $oNode.outerhtml = ""

		 ExitLoop		; Die For-Schleife sofort verlassen,
						; weil hier nicht mehr sinnvoller Inhalt stehen kann.

	  EndIf

   Next		; For $oNode in $oChildNodes

   ; ENDE: Sonderfall "alte" LOOPs.

   ; Bei "neuen" LOOPs steht die Überschrift der Seite in diesem div
   ; Und alle weiteren Nodes dieses div enthalten den Content der Seite.
   $oDiv = _IEGetObjById($oIE, "mw-content-text")

   $oChildNodes = $oDiv.childNodes		; Aus dem div alle childNodes ermitteln

   For $oNode in $oChildNodes

	  If ( $sTitle = "" ) Then
		 ; Es wurde bislang noch keine Überschrift der Seite gefunden.
		 ; Entweder ist dieser $oNode eine Überschrift,
		 ; oder sein Inhalt kann ignoriert werden,
		 ; weil über der Seitenüberschrift nichts Sinnvolles stehen kann.

		 If (StringInStr( $oNode.outerhtml, '<h1>' ) = 1) or (StringInStr( $oNode.outerhtml, '<h2>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h3>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h4>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h5>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h6>' ) = 1) Then

			; Ja, hier ist die Seitenüberschrift.
			; Jetzt die Überschrift extrahieren:
			$sTitle = $oNode.innertext

			$HTMLParts[$part] = $sTitle
			$part += 1

			; Den Inhalt dieses Nodes löschen, da er nicht ein zweites Mal
			; verarbeitet werden darf.
			$oNode.outerhtml = ""

		 EndIf
	  Else
		 ; Es wurde bereits die Seitenüberschrift gefunden.
		 ; Jetzt weiter mit allen anderen Inhalten

		 If ($oNode.innertext = '') Then
			$oNode.outerhtml = ''
		 Else

			; Alle HTML-Tags, die Überschriften sind:
			If  (StringInStr( $oNode.outerhtml, '<h1>' ) = 1) or (StringInStr( $oNode.outerhtml, '<h2>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h3>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h4>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h5>' ) = 1) Or (StringInStr( $oNode.outerhtml, '<h6>' ) = 1) Then
			   ; Überschrift
			   $HTMLParts[$part] = $oNode.innertext
			   $part += 1
			Else
			  ; keine Überschrift

			   If Not (StringInStr( $oNode.outerhtml, '<div class="autoit_do_not_print">' ) = 1) Then
				  $HTMLParts[$part] = $oNode.outerhtml
				  $part += 1
			   EndIf

			EndIf

		 EndIf

	  EndIf

   Next		; For $oNode in $oChildNodes

   ; ----------------------------------------------------------------

   ; In dem Array $HTMLParts stehen jetzt die aufgetrennten Seitenteile.
   ; Die Variable $part enthält aktuell die Anzahl der ermittelten Seitenteile.
   ;
   ; Wenn ein Feld in $HTMLParts mit einem < beginnt, so handelt es sich un einen HTML-Tag.
   ; Wenn ein Feld in $HTMLParts nicht mit einem < beginnt, so handelt es sich um eine
   ; Überschrift. Von Überschriften wird nur der reine Text gespeichert.
   ;
   ; $HTMLParts[0] enthält den Titel der in diesem Durchlauf behandelten Seite $ALL_LINKS[ $URL_NO ]

   ; ----------------------------------------------------------------

   ; Jetzt jeweils nur einen Teil im Browser darstellen,
   ; (also ein Feld aus $HTMLParts)
   ; dann einen Screenshot machen,
   ; und den Screenshot in Word einfügen.

   ; ---------------------------------------------------------
   ; Einfügen der Seitenüberschrift in Word

   WinActivate( $hWord_Window_Handle, "" )		; Dem Word-Fenster den Fokus geben.

   Send( $sTitle )
   Send( "^l" )				; STRG l   -->   Den Absatz linksbündig formatieren. "l" wie Ludwig!
   Send( "!1" )				; ALT 1   -->   Dem Absatz "Überschift 1" zuweisen. Ziffer "1"!
   Send( "{ENTER}" )
   Send( "{ENTER}" )
   Send( "^e" )				; STRG e   -->   Absatz zentrieren

   ; Einen Moment abwarten, bis Word mit dem Einfügen fertig ist.
   Sleep( 100 )

   ; -------------------------------------------------------------------------
   ; Jetzt die Screenshots machen

   For $partnr = 1 To ($part - 1)

	  If Not (StringInStr( $HTMLParts[ $partnr ], '<' ) = 1) Then
		 ; Der aktuelle Teil beginnt NICHT mit einem '<', deshalb muss es eine Überschrift sein.

		 ; Einfügen der Seitenüberschrift in Word

		 ; Dem Word-Fenster den Fokus geben.
		 WinActivate( $hWord_Window_Handle, "" )

		 Send( "{ENTER}" )
		 Send( $HTMLParts[ $partnr ] )
		 Send( "^l" )				; STRG l   -->   Den Absatz linksbündig formatieren. "l" wie Ludwig!
		 Send( "!2" )				; ALT 2   -->   Dem Absatz "Überschift 2" zuweisen.
		 Send( "{ENTER}" )
		 Send( "^e" )				; STRG e   -->   Absatz zentrieren

		 ; Einen Moment abwarten, bis Word mit dem Einfügen fertig ist.
		 Sleep( 200 )

	  Else

		 $oDiv.innerhtml = $HTMLParts[ $partnr ]

		 ; Einen Moment abwarten, damit die Inhalte im Browser auch
		 ; korrekt aufgebaut werden können.
		 Sleep( 500 )

		 ; ---------------------------------------------------------
		 ; Anpassen der Höhe des Browserfensters, damit FireShot
		 ; bei der Aufnahme möglichst nicht scrollen braucht

		 $oDoc = _IEDocGetObj( $oIE )
		 ; siehe document object http://msdn.microsoft.com/en-us/library/ms535862%28v=vs.85%29.aspx#properties

		 $oBody = $oDoc.body
		 ; siehe body object http://msdn.microsoft.com/en-us/library/ms535205%28v=vs.85%29.aspx#properties

		 ; Dies ist die Höhe des Content-Teils im Browser:
		 $bodyHeight = _IEPropertyGet( $oBody, "height" )

		 ; Dies ist die Höhe des Browsers, ohne die angezeigte Webseite.
		 ; Also Titelleiste im Fenster, Menüzeile, Linksleiste, Statusleiste, etc.
		 ; Dieser Wert muss ggf. an den eigenen Browser angepasst werden.
		 Local $individualBrowserHeight = 107

		 ; Neue Fensterhöhe setzen:
		 _IEPropertySet( $oIE, "height", $individualBrowserHeight + $bodyHeight )

		 ; ---------------------------------------------------------

		 ; Dem IE-Fenster den Fokus geben
		 WinActivate( $hIE_Window_Handle, "" )

		 ; Auf den FireShot-Button im Browser klicken.
		 ; Die Koordinaten müssen stimmen!
		 MouseClick( "left", $FireShot_X, $FireShot_Y )

		 ; Einen Moment abwarten, damit FireShot seine Arbeit tun kann.
		 Sleep( 1000 )

		 ; ---------------------------------------------------------
		 ; Einfügen des Screenshot in Word

		 ; Dem Word-Fenster den Fokus geben.
		 WinActivate( $hWord_Window_Handle, "" )

		 ; Auf die Titelleiste des Word-Fensters klicken.
		 ; MouseClick( "left", $WORD_X, $WORD_Y)

		 Send( "^v" )		; STRG v   -->   Inhalt der Zwischenablage einfügen
		 Send( "{Enter}" )

		 ; Einen Moment abwarten, bis Word mit dem Einfügen fertig ist.
		 Sleep( 200 )

	  EndIf

   Next		; For $partnr = 1 To ($part - 1)

   ; ---------------------------------------------------------------------

   ; Jetzt ist eine einzelne URL aus dem Array $ALL_LINKS abgearbeitet,
   ; also eine LOOP-Seite ist fertig.

   ; ---------------------------------------------------------------------

   ; Das Fenster des IE wieder schließen
   _IEQuit( $oIE )

Next	; For $URL_NO = $START_NO To $END_NO

; ---------------------------------------------------------
; Einfügen der Seitenüberschrift in Word

; Dem Word-Fenster den Fokus geben.
WinActivate( $hWord_Window_Handle, "" )

Send( "^{HOME}" )			; STRG POS1   -->   An den Dokumentenanfang springen.
Send( "^l" )				; STRG l   -->   Den Absatz linksbündig formatieren. "l" wie Ludwig!
Send( "Quelle: {TAB}" )
Send( $sURL_TOC )
Send( "{ENTER}" )
Send( "{ENTER}" )
Send( "Stand: {TAB}" )
Send( "!D" )				; ALT SHIFT d   -->   Das aktuelle Datum einfügen.
Send( "{ENTER}" )
Send( "{ENTER}" )
Send( "Bei Bedarf:" )
Send( "{ENTER}" )
Send( "{TAB}Manuell ein Inhaltsverzeichnis einfügen." )
Send( "{ENTER}" )
Send( "{TAB}Seitenzahlen in Kopf- oder Fußzeile einfügen." )
Send( "{ENTER}" )
Send( "{ENTER}" )

; Einen Moment abwarten, bis Word mit dem Einfügen fertig ist.
Sleep( 200 )

Exit