Automatisierte Dokumentenerstellung mit PHPWord und PHPPowerPoint – Teil 2
Kommentare

Im Dokument soll ein Inhaltsverzeichnis eingefügt werden, das sich automatisch anhand der Überschriften der ersten und zweiten Ebene aufbaut.

Im Dokument soll ein Inhaltsverzeichnis eingefügt werden, das sich automatisch anhand der Überschriften der ersten und zweiten Ebene aufbaut. Die Darstellung des Inhaltsverzeichnisses wird im Beispielskript über die Variablen $fontStyleTOC und $styleTOC definiert. Der Namen orientiert sich am englischen Begriff „Table of Content“, kurz TOC. Mit tabLeader wird angegeben, wie der Platz zwischen Überschrift und Seitenzahl gefüllt werden soll. Im Beispiel geschieht dies mit Punkten (TABLEADER_DOT), möglich sind jedoch auch Unterstriche (TABLEADER_UNDERSCORE), Bindestriche (TABLEADER_LINE) oder keine Zeichen (TABLEADER_NONE) (Listing 1).
Listing 1
//  Create New Word Document
$PHPWord = new PHPWord();

// Set Font Styles
$fontStyleNormal =   array('size'=>12, 'color'=>'666666', 'bold'=>false);
$fontStyleBold =   array('size'=>16, 'color'=>'000000', 'bold'=>true);
$fontStyleWhite =   array('size'=>10, 'color'=>'FFFFFF', 'bold'=>true);

// Add Font Style to document
$PHPWord->addFontStyle('Standard', $fontStyleNormal);
$PHPWord->addFontStyle('Fett', $fontStyleBold);
$PHPWord->addFontStyle('Weiss', $fontStyleWhite);

// Define the Title font styles
$fontStyleTitle1 =   array('size'=>20, 'color'=>'333333', 'bold'=>true);
$fontStyleTitle2 =   array('size'=>16, 'color'=>'666666', 'italic'=>true);

// Define the Title paragraph styles
// Points in doc * 20
$paragraphStyleTitle1 = array('align' => 'center', 'spaceBefore' => 5 * 20, 'spaceAfter'=> 10 * 20);
$paragraphStyleTitle2 = array('align' => 'left', 'spaceBefore' => 4 * 20, 'spaceAfter'=> 8 * 20);

// Add Title Styles
$PHPWord->addTitleStyle(1, $fontStyleTitle1, $paragraphStyleTitle1);
$PHPWord->addTitleStyle(2, $fontStyleTitle2, $paragraphStyleTitle2);

// Define the TOC font style
$fontStyleTOC = array('size'=>12);
$styleTOC = array('tabLeader'=>PHPWord_Style_TOC::TABLEADER_DOT, 'tabPos' => 8000);
Nach der Definition der Schrift- und Absatzformatierungen werden die Dokumenteneigenschaften wie Autor oder Titel festgelegt. Diese sind sowohl für die späteren Empfänger als auch weiterverarbeitende Programme wie Dokumentenmanagementsysteme (DMS) sehr nützlich (Listing 2).
Listing 2
// Document Properties
$PHPWord->getProperties()
          ->setCreator('Ralf Hohoff')
          ->setTitle('The Power of PHPWord!')
          ->setDescription('Showtime for the fantastic features of PHPWord')
          ->setCategory('Test')
          ->setLastModifiedBy('Ralf Hohoff')
          ->setCreated( mktime(0, 0, 0, 5, 16, 2011) )
          ->setModified( mktime(0, 0, 0, 5, 20, 2011) )
          ->setSubject('My subject')
          ->setKeywords('office 2007 openxml php');
Der Code in Listing 2 ist ein Musterbeispiel für aufgeräumten Quellcode, ermöglicht durch verkettete Methoden (Fluent Interfaces). Häufig will man auf einem Objekt mehrere Methoden nacheinander aufrufen. Das wird aber schnell unübersichtlich, wenn man immer den Objektnamen vor den Methodennamen schreiben muss. Mit den verketteten Methoden wird der Quellcode wesentlich lesbarer und erleichtert auf diese Weise die Anwendung der objektorientierten Programmierung. In unserem Beispiel werden nacheinander die Methoden setCreator, setLastModifiedBy usw. auf dem Objekt $PHPWord->getProperties()aufgerufen, ohne in jeder Zeile den Teil $PHPWordl->getProperties() zu wiederholen. Nach der Vorbereitung soll nun die Ausgabe des eigentlichen Inhalts in unserem Dokument erfolgen. Dafür benötigen wir einen Abschnitt, zumal in Word jedes sichtbare Element innerhalb eines Abschnitts platziert wird. In Listing 3 wird nach der Angabe der Ausrichtung Querformat (landscape) und der Breite der Seitenränder in den bereits bekannten Twips mit dem Aufruf $section = $PHPWord->createSection($sectionStyle) ein Abschnitt im Word-Dokument erzeugt. Um die Twips für einen Seitenabstand von 2,5 Zentimeter zu ermitteln, ist der Rechenweg der folgende: Gewünschtes Maß in Zentimetern * 1440 Twips / 1 Zoll = 2,5 cm * 1440 Twips / 2,54 cm = 1417 Twips.
Listing 3
// New landscape section
// Properties are all case sensitive !
$sectionStyle = array('orientation' => 'landscape',
      'marginLeft' => 1417,
      'marginRight' => 900,
      'marginTop' => 900,
      'marginBottom' => 900);

$section = $PHPWord->createSection($sectionStyle);
Um dem Dokument einen Rahmen zu geben, werden auch die Kopf- und Fußzeilen festgelegt (Listing 4). Auf dem Abschnittsobjekt wird mit $section->createHeader()der Kopf erstellt und darin eine zweispaltige Tabelle angelegt. Links wird einfach der Text ohne weitere Angaben zu Schrift- und Absatzformatierung ausgegeben, rechts das Logo des PHP Magazins. Die Fußzeile wird analog erstellt und mit $footer->addPreserveText(Seite {PAGE} von {NUMPAGES}) der Autotext von MS Word angesprochen. Die Variablen werden durch die Anwendung zur Laufzeit durch die aktuelle Seite und die absolute Seitenanzahl ersetzt. Es folgt die Ausgabe des Schriftzuges „Inhaltsverzeichnis“ in der vorher definierten Schriftart „Fett“. Nach zwei Zeilenumbrüchen wird das dynamische Inhaltsverzeichnis ausgegeben. Dynamisch bedeutet in diesem Zusammenhang, dass es auch nach späterer Bearbeitung des Word-Dokuments aktualisiert werden kann. Das vorläufige Ergebnis zeigt Abbildung 3.
Listing 4
// Add header
$header = $section->createHeader();
$table = $header->addTable();
$table->addRow();
$table->addCell(4500)->addText('Ausgabe 5.2011 vom 13. Juli 2011');
$table->addCell(4500)->addImage('logo.jpg', array('width'=>150, 'height'=>48, 'align'=>'right'));

// Add footer
$footer = $section->createFooter();
$footer->addPreserveText('Seite {PAGE} von {NUMPAGES}', array('align'=>'center'));

// Add text elements
$section->addText('Inhaltsverzeichnis', 'Fett');
$section->addTextBreak(2);
// Add TOC
$section->addTOC($fontStyleTOC, $styleTOC);

$section->addPageBreak();
Abb. 3: Der Aufbau von Kopf- und Fußzeilen sowie eines dynamischen Inhaltsverzeichnisses wird mit PHPWord komfortabel gelöst
Um ein Inhaltsverzeichnis dynamisch aufzubauen bzw. zu füllen, sind Überschriften erforderlich. Mit den wenigen folgenden Zeilen Quellcode werden exemplarisch die Überschriften der ersten Ebene (Kapitel) und der zweiten Ebene (Bereich) im Word-Dokument eingerichtet, wie sie auch in Abbildung 3 zu sehen sind:
// chapter title
$section->addTitle('PHP magazin', 1);
// section title
$section->addTitle('Ausgabe 5.2011', 2);
Nach dem Einfügen weiterer Texte, eines Seitenumbruchs und zweier Überschriften wird eine Tabelle ausgegeben. Listing 5 zeigt, wie vor der Ausgabe des Tabelleninhalts die Gestaltung der Tabelle und wenn gewünscht der ersten Zeile definiert werden. Nach dem Aufruf $PHPWord->addTableStyle kann auf diese Weise die Formatierung zentral an einer Stelle verwaltet und vielfach im Dokument eingesetzt werden.
Listing 5
$styleTable = array('borderColor'=>'69A619',
          'borderSize'=>0,
          'cellMargin'=>50);
$styleFirstRow = array('bgColor'=>'69A619');
$PHPWord->addTableStyle('myGreenTable', $styleTable, $styleFirstRow);

$table = $section->addTable('myGreenTable');
$table->addRow();
$table->addCell(2000)->addImage('logo_entwickler.jpg', array('width'=>150, 'height'=>48, 'align'=>'left'));
$table->addCell(8000)->addText('Ausgabe 3.2011 vom 13. Juli 2011 | www.entwickler-magazin.de', 'Weiss', array('align'=>'right'));
Um die Absatzfunktionalität „Rechtsbündig“ in Tabellenzellen zu nutzen, muss man die Datei PHPWord/Section/Table/Cell.php anpassen. In Zeile 110 ist der Block
public function addText($text, $style = null) {
$text = utf8_encode($text);
$text = new PHPWord_Section_Text($text, $style);
$this->_elementCollection[] = $text;
return $text;
}
durch folgenden zu ersetzen:
public function addText($text, $styleFont = null, $styleParagraph = null) {
$givenText = utf8_encode($text); 
$text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph); 
$this->_elementCollection[] = $text;
return $text; 
}
Anscheinend wurde die Umstellung in Version 0.6.2, die Schrift- und Absatzformatierung zu trennen, nicht konsequent in allen Methodenaufrufen umgesetzt. Mehr Details befinden sich unter [4]. Weitere Teile: Teil 1 Teil 3 Teil 4
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -