6.5 Inhalt dieses LOOPs ausdrucken

[unmarkierte Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
=Inhalt dieses LOOPs ausdrucken=
=Inhalt dieses LOOPs ausdrucken=
<p>
Die erste Wahl beim Drucken des Inhalts dieses LOOPs geht in jedem Fall über die [[Special:LoopPrintversion|PDF-Version]] dieses Skripts.
</p>
<p>
Wer etwas mehr Wert darauf legt, dass der Ausdruck möglichst exakt so aussieht, wie die Inhalte hier im Browser, der kann zu dieser Bastellösung greifen.
</p>
<p>
Die Bastellö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.
</p>
<p>
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.
</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!
</p>
<loop_area type="sourcecode">
<source line="false">
#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
</source>
</loop_area>

Version vom 18. November 2014, 11:35 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 Bastellösung greifen.

Die Bastellö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. 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!

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