All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.extra.xtt.util.pdf.PdfCreatorImpl Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package de.extra.xtt.util.pdf;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;

import org.apache.log4j.Logger;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.sun.xml.xsom.XSAnnotation;
import com.sun.xml.xsom.XSAttGroupDecl;
import com.sun.xml.xsom.XSAttributeDecl;
import com.sun.xml.xsom.XSAttributeUse;
import com.sun.xml.xsom.XSComplexType;
import com.sun.xml.xsom.XSDeclaration;
import com.sun.xml.xsom.XSElementDecl;
import com.sun.xml.xsom.XSModelGroup;
import com.sun.xml.xsom.XSModelGroup.Compositor;
import com.sun.xml.xsom.XSParticle;
import com.sun.xml.xsom.XSSchema;
import com.sun.xml.xsom.XSSchemaSet;
import com.sun.xml.xsom.XSType;
import com.sun.xml.xsom.XSWildcard;
import com.sun.xml.xsom.impl.ElementDecl;

import de.extra.xtt.util.schema.MySchemaWriter;
import de.extra.xtt.util.tools.Configurator;

/**
 * Implementierung für die Erzeugung einer PDF-Dokumentation
 * 
 * @author Beier
 */
public class PdfCreatorImpl implements PdfCreator {

	private static Logger logger = Logger.getLogger(PdfCreatorImpl.class);

	private final String fontNameStandard = FontFactory.HELVETICA;

	private final int fontSizeChapter = 18;
	private final int fontSizeElement = 14;
	private final int fontSizeText = 11;
	private final int fontSizeFooter = 9;
	private final int fontSizeTextHalf = 5;

	// Aufz�hlungszeichen f�r die erste und zweite Ebene
	private final String bulletMain = "\u2022";
	private final String bulletSub = "-";

	private final Configurator configurator;
	private Document docPdf;
	private int chapterCounter;
	private String dateiname;
	private String bezVerfahren;

	private java.util.List listEntries;
	private int currPageNumber;

	/**
	 * Konstruktor mit der Initialisierung des Configurator-Objekts
	 * 
	 * @param configurator
	 *            Objekt zum Zugriff auf Properties und Einstellungen
	 */
	public PdfCreatorImpl(Configurator configurator) {
		this.configurator = configurator;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public void erzeugePdfDoku(String filePath, XSSchemaSet xmlSchemaSet,
			String bezVerfahren) throws PdfCreatorException {
		try {
			this.dateiname = filePath;
			this.bezVerfahren = bezVerfahren;
			this.listEntries = new java.util.LinkedList();

			// Erzeuge PDF-Doku ohne Inhaltsverzeichnis
			erzeugePdfDatei(xmlSchemaSet, false);

			// Erzeuge temp. Inhaltsverzeichnis
			int anzPagesInhalt = erzeugeInhaltsverzeichnis(null, true);
			// Seitenzahlen aktualisieren
			for (ContPdfEntry currEntry : listEntries) {
				currEntry.setPageNumber(currEntry.getPageNumber()
						+ anzPagesInhalt);
			}

			// Dokument inkl. Inhaltsverzeichnis neu schreiben
			erzeugePdfDatei(xmlSchemaSet, true);

			if (logger.isInfoEnabled()) {
				logger.info("PDF-Dokumentation '" + filePath
						+ "' erfolgreich gespeichert.");
			}
		} catch (Exception e) {
			throw new PdfCreatorException("Fehler beim Erzeugen der PDF-Doku.",
					e);
		}
	}

	/**
	 * Erzeugt die PDF-Doku f�r das �bergebene SchemaSet und optional mit
	 * Inhaltsverzeichnis
	 * 
	 * @param xmlSchemaSet
	 *            SchemSet mit allen Elementen und Typen
	 * @param writeInhaltsverzeichnis
	 *            Gibt an, ob ein Inhaltsverzeichnis erstellt werden soll
	 * @throws DocumentException
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	private void erzeugePdfDatei(XSSchemaSet xmlSchemaSet,
			boolean writeInhaltsverzeichnis) throws DocumentException,
			MalformedURLException, IOException {
		// PDF-Writer und PDF-Dokument initalisieren
		docPdf = initPdfWriterAndDocument(dateiname, true);

		// Titelseite
		erzeugeTitelSeite();

		// Inhaltsverzeichnis
		if (writeInhaltsverzeichnis) {
			erzeugeInhaltsverzeichnis(docPdf, false);
		}

		// Queues f�r Schemata anlegen
		Map> schemaQueues = new HashMap>();

		// Erstes Element in allen Schemata suchen und Queue-Objekte anlegen
		String strRootElement = configurator
				.getPropertySystem(Configurator.PropBezeichnungSystem.SCHEMA_ROOT_ELEMENT);
		for (XSSchema currSchema : xmlSchemaSet.getSchemas()) {
			// Neue Queue f�r aktuelles Schema anlegen
			String nsPrefix = getNsPref(currSchema.getTargetNamespace());
			schemaQueues.put(nsPrefix, new LinkedList());

			// Pr�fen, ob erstes Element in diesem Schema enthalten ist
			XSElementDecl currFirstElement = currSchema
					.getElementDecl(strRootElement);
			if (currFirstElement != null) {
				// Element als erstes Element dieser Queue hinzuf�gen
				schemaQueues.get(nsPrefix).add(currFirstElement);
			}
		}

		// Queues der Reihe nach abarbeiten
		for (String currPrefix : configurator.getSchemaPrefixSorted()) {
			behandleSchemaQueue(currPrefix, schemaQueues, xmlSchemaSet);
		}

		// Dokument schlie�en
		docPdf.close();

	}

	/**
	 * Erzeugt das Inhaltsverzeichnis aus den bereits vorhandenen Elementen in
	 * der Liste listEntries.
	 * 
	 * @param docPdf
	 *            Zieldokument, falls Inhaltsverzeichnis nicht tempor�r erzeugt
	 *            wird
	 * @param temp
	 *            Gibt an, ob das Inhaltsverzeichnis tempor�r in einer neuen
	 *            Datei/Dokument erzeugt werden soll
	 * @return Anzahl der Seiten
	 * @throws DocumentException
	 * @throws IOException
	 */
	private int erzeugeInhaltsverzeichnis(Document docPdf, boolean temp)
			throws DocumentException, IOException {

		int anzPages = 0;
		Document docInhalt = docPdf;
		String filePathTempInhaltString = "";

		if (temp) {
			// temp. Dateinamen bestimmen
			File fileDokuFile = new File(dateiname);
			filePathTempInhaltString = fileDokuFile.getParent()
					+ "/tmp_inhalt.pdf";
			// Neues Dokument erzeugen
			docInhalt = initPdfWriterAndDocument(filePathTempInhaltString,
					false);
		}

		// �berschrift
		Chapter currChapter = new Chapter(
				getParagraphChapter("Inhaltsverzeichnis"), 0);
		// 0, damit keine Nummerierung
		currChapter.setNumberDepth(0);
		docInhalt.add(currChapter);
		// eine Zeile Abstand
		docInhalt.add(getEmptyLineTextHalf());

		for (ContPdfEntry currEntry : listEntries) {

			// Eintrag erzeugen inkl. Abstand
			String strEintrag = currEntry.getBezeichnung() + "  ";
			Chunk chunkBezeichnung;
			Chunk chunkSeitenzahlChunk;
			if (currEntry.getParentEntry() == null) {
				// 1. Ebene => fett, Abstand davor einf�gen
				docInhalt.add(getEmptyLineTextHalf());
				chunkBezeichnung = getChunkTextBold(strEintrag);
				chunkSeitenzahlChunk = getChunkTextBold(""
						+ currEntry.getPageNumber());
			} else {
				// 2. Ebene
				chunkBezeichnung = getChunkText(strEintrag);
				chunkSeitenzahlChunk = getChunkText(""
						+ currEntry.getPageNumber());
			}
			// Referenz setzen
			chunkBezeichnung.setLocalGoto(currEntry.getDestination());
			chunkSeitenzahlChunk.setLocalGoto(currEntry.getDestination());
			// Abstandzeichen generieren, Breite auff�llen
			float widthAbstand = docInhalt.getPageSize().getWidth() * 0.81f;
			;
			while (chunkBezeichnung.getWidthPoint() <= widthAbstand) {
				chunkBezeichnung.append(".");
			}

			// Tabelle erzeugen und formatieren
			PdfPTable currTable = new PdfPTable(2);
			currTable.setWidthPercentage(100f);
			currTable.setWidths(new int[] { 96, 4 });

			// Inhalte einf�gen
			// Zelle Bezeichnung
			PdfPCell currCellBezeichnung = new PdfPCell(new Phrase(
					chunkBezeichnung));
			currCellBezeichnung.setBorder(0);
			currCellBezeichnung
					.setHorizontalAlignment(Element.ALIGN_JUSTIFIED_ALL);

			// Zelle Seitennummer
			PdfPCell currCellPageNumberCell = new PdfPCell(new Phrase(
					chunkSeitenzahlChunk));
			currCellPageNumberCell.setBorder(0);
			currCellPageNumberCell.setHorizontalAlignment(Element.ALIGN_RIGHT);

			// Zellen zur Tabelle hinzuf�gen
			currTable.addCell(currCellBezeichnung);
			currTable.addCell(currCellPageNumberCell);

			docInhalt.add(currTable);
		}

		if (temp) {
			// Dokument schlie�en
			docInhalt.close();

			// Anzahl der Seitenzahlen bestimmen
			PdfReader reader = new PdfReader(filePathTempInhaltString);
			anzPages = reader.getNumberOfPages();
			reader.close();

			// temp. Datei l�schen
			File currFileInhaltFile = new File(filePathTempInhaltString);
			currFileInhaltFile.delete();
		}
		return anzPages;
	}

	/**
	 * Alle Elemente, die sich f�r das angegebene Schema in der entsprechenden
	 * Queue befinden, werden behandelt.
	 * 
	 * @param currSchemaPrefix
	 *            Pr�fix des zu behandelnden Schemas
	 * @param schemaQueues
	 *            Map enth�lt Queues f�r jedes Schema (Key ist der
	 *            Namepace-Pr�fix)
	 * @param xmlSchemaSet
	 *            SchemaSet, in dem alle Typen und Elemente definiert sind
	 * @throws DocumentException
	 */
	private void behandleSchemaQueue(String currSchemaPrefix,
			Map> schemaQueues,
			XSSchemaSet xmlSchemaSet) throws DocumentException {

		// Liste mit allen bereits behandelten Elementen
		java.util.List listElementsInserted = new LinkedList();

		// Aktuelle Queue
		Queue currQueue = schemaQueues.get(currSchemaPrefix);

		if (currQueue != null) {

			// zur Sicherheit nochmal alle Elemente dieses Schema in Queue
			// einf�gen
			// damit ist sichergestellt, dass auch nicht direkt verkn�pfte
			// Elemente (any => Plugins) behandelt werden
			XSSchema currSchema = xmlSchemaSet.getSchema(configurator
					.getPropertyNamespace(currSchemaPrefix));
			for (Entry currElement : currSchema
					.getElementDecls().entrySet()) {
				currQueue.add(currElement.getValue());
			}

			if (currQueue.peek() != null) {
				// Kapitel inkl. Sprungmarke erstellen
				String targetNsUrl = currQueue.peek().getTargetNamespace();
				String chapterTitle = getNsPref(targetNsUrl) + ":"
						+ targetNsUrl;
				chapterCounter++;
				Chunk chunkChapter = getChunkChapter(chapterTitle);
				chunkChapter.setLocalDestination(chapterTitle);
				Chapter currChapter = new Chapter(new Paragraph(chunkChapter),
						chapterCounter);

				// Kapitel dem Dokument hinzuf�gen
				docPdf.add(currChapter);

				// Eintrag f�r Inhaltsverzeichnis (Chapter)
				ContPdfEntry currEntry = new ContPdfEntry(null, currChapter
						.getTitle().getContent(), chapterTitle, currPageNumber);
				listEntries.add(currEntry);

				while (currQueue.peek() != null) {
					// Aktuelles Element aus Queue holen
					XSElementDecl currElement = currQueue.poll();
					if (!listElementsInserted.contains(currElement)) {
						behandleElement(currElement, currChapter, currEntry,
								schemaQueues);
						listElementsInserted.add(currElement);
					}
				}
			}
		}
	}

	/**
	 * Das Element wird mit Datentyp, seinen Attributen und Kindelementen
	 * geschrieben.
	 * 
	 * @param currElement
	 *            Zu behandelndes Element
	 * @param currChapter
	 *            Kapitel, zu dem das Element hinzugef�gt wird
	 * @param chapterEntry
	 *            Eintrag des Kapitels f�r das Inhaltsverzeichnis
	 * @param schemaQueues
	 *            Queues mit allen Elementen f�r die einzelnen Schemas
	 */
	private void behandleElement(XSElementDecl currElement,
			Chapter currChapter, ContPdfEntry chapterEntry,
			Map> schemaQueues)
			throws DocumentException {
		// F�r jedes Element eine Section; Titel ist der Elementname

		// eine Zeile Abstand
		docPdf.add(getEmptyLineText());

		// Referenz des Elements
		String currReferenzString = getReferenceForElement(currElement);

		// Titel des Elements inkl. Sprungmarke
		Chunk chunkElem = getChunkElement(currElement.getName());
		chunkElem.setLocalDestination(currReferenzString);

		Paragraph currElemPara = new Paragraph(getChunkElement(""));
		currElemPara.add(chunkElem);
		Section currSection = currChapter.addSection(currElemPara);

		// Eintrag f�r Inhaltsverzeichnis (Element)
		listEntries.add(new ContPdfEntry(chapterEntry, currSection.getTitle()
				.getContent(), currReferenzString, currPageNumber));

		// Sektion dem Dokument (vorl�ufig) hinzuf�gen (wichtig f�r das
		// Aktualisieren der Seitenzahl)
		currSection.setComplete(false);
		docPdf.add(currSection);

		// Anmerkung zum Element
		XSAnnotation ann = currElement.getAnnotation();
		if (ann != null) {
			// Abstand
			currSection.add(getEmptyLineTextHalf());

			String beschreibung = ann.getAnnotation().toString();
			currSection.add(getParagraphTextItalic(beschreibung));
		}

		// Abstand
		currSection.add(getEmptyLineTextHalf());

		// Datentyp
		Paragraph paraTyp = new Paragraph();
		XSType currType = currElement.getType();
		paraTyp.add(getPhraseTextBold("Datentyp: "));
		String strTyp = getNameWithPrefix(currType);
		if (currType.isLocal()) {
			strTyp = "";
		}
		paraTyp.add(getPhraseText(strTyp + "\n"));

		// Basistyp
		if ((currType.getDerivationMethod() == XSType.RESTRICTION)
				|| (currType.getDerivationMethod() == XSType.EXTENSION)) {
			paraTyp.add(getPhraseTextBold("basiert auf: "));
			paraTyp.add(getPhraseText(getNameWithPrefix(currType.getBaseType())
					+ "\n"));
		}
		currSection.add(paraTyp);

		// Attribute (falls vorhanden)
		behandleAttribute(currType, currSection);

		// Kind-Elemente (falls vorhanden)
		if (currType.isComplexType()) {
			// Gruppentyp (sequence oder choice)
			String strCompositor = getCompositorStr(currType.asComplexType());
			if (strCompositor.length() > 0) {
				// Abstand
				currSection.add(getEmptyLineTextHalf());

				currSection.add(getParagraphTextBold(strCompositor
						+ "-Elemente:"));
				behandleKindElemente(currElement, currSection, schemaQueues);
			}
		}

		// Sektion dem Dokument (endg�ltig) hinzuf�gen
		currSection.setComplete(true);
		docPdf.add(currSection);
	}

	/**
	 * Die Kindelemente (Sequence oder Choice) des �bergebenen Elements werden
	 * behandelt
	 * 
	 * @param currElementMain
	 *            Element, dessen Kindelemente gesucht und behandelt werden
	 * @param currSection
	 *            Sektion des PDF-Dokuments
	 * @param schemaQueues
	 *            Queues mit allen Elementen f�r die einzelnen Schemas
	 */
	private void behandleKindElemente(XSElementDecl currElementMain,
			Section currSection, Map> schemaQueues) {

		// Kind-Elemente bestimmen
		XSParticle[] childs = null;
		XSType currType = currElementMain.getType();
		if (currType.isComplexType()) {
			XSParticle currParticle = null;
			if (currType.asComplexType().getExplicitContent() != null) {
				currParticle = currType.asComplexType().getExplicitContent()
						.asParticle();
			} else if (currType.asComplexType().getContentType() != null) {
				currParticle = currType.asComplexType().getContentType()
						.asParticle();
			}
			if (currParticle != null) {
				XSModelGroup modelGroup = currParticle.getTerm().asModelGroup();
				childs = modelGroup.getChildren();
			}
		}

		if ((childs != null) && (childs.length > 0)) {
			// F�r jedes Kind wird ein Listeneintrag erstellt
			List currList = erzeugeListeFuerKindElemente(childs, schemaQueues,
					bulletMain);
			currSection.add(currList);
		}
	}

	/**
	 * F�r die angegebenen Kindlemente wird ein Listeneintrag f�r das PDF
	 * erzeugt.
	 * 
	 * @param childs
	 *            Kindelemente
	 * @param schemaQueues
	 *            Queues mit allen Elementen f�r die einzelnen Schemas
	 * @param strBullet
	 *            Zeichen, das als Aufz�hlunsgzeichen f�r die Liste verwendet
	 *            wird
	 * @return PDF-Liste mit den Kindelementen
	 */
	private List erzeugeListeFuerKindElemente(XSParticle[] childs,
			Map> schemaQueues, String strBullet) {

		List currList = new List(false, 12);
		currList.setListSymbol(strBullet);

		for (XSParticle currChild : childs) {

			if (currChild.getTerm() instanceof ElementDecl) {
				// Elemente von sequence bzw. choice abarbeiten
				XSElementDecl currElement = currChild.getTerm().asElementDecl();

				Phrase currPhrase = new Phrase();

				// Name, inkl. Referenz auf das Element
				currPhrase.add(getChunkTextBoldWithReference(
						getNameWithPrefix(currElement),
						getReferenceForElement(currElement)));

				// Auftreten (direkt hinter dem Namen)
				currPhrase.add(getChunkText(" (" + getMinMaxStr(currChild)
						+ ")\n"));

				// Beschreibung
				XSAnnotation currAnn = currChild.getAnnotation();
				if ((currAnn == null) && currElement.isLocal()
						&& (currElement.getAnnotation() != null)) {
					currAnn = currElement.getAnnotation();
				}
				if (currAnn != null) {
					currPhrase.add(getChunkTextItalic(currAnn.getAnnotation()
							.toString() + "\n"));
				}

				currList.add(new ListItem(currPhrase));

				// Element in Queue einf�gen
				String currPrefix = getNsPref(currElement.getTargetNamespace());
				schemaQueues.get(currPrefix).add(currElement);

			} else if (currChild.getTerm() instanceof XSModelGroup) {
				// Element von sequence/choice kann wieder eine ModelGroup
				// (sequence/choice) sein
				XSModelGroup mg = currChild.getTerm().asModelGroup();
				XSParticle[] childChilds = mg.getChildren();
				if ((childChilds != null) && (childChilds.length > 0)) {

					// Art der Gruppe
					String strCompositor = "";
					Compositor compositor = mg.getCompositor();
					if (compositor
							.equals(com.sun.xml.xsom.XSModelGroup.Compositor.SEQUENCE)) {
						strCompositor = "Sequence:";
					} else if (compositor
							.equals(com.sun.xml.xsom.XSModelGroup.Compositor.CHOICE)) {
						strCompositor = "Choice:";
					}
					currList.add(new ListItem(getPhraseTextBold(strCompositor)));

					// neue Liste f�r aktuelle Kindelemente erzeugen
					List subList = erzeugeListeFuerKindElemente(childChilds,
							schemaQueues, bulletSub);

					// Als Subliste hinzuf�gen
					currList.add(subList);
				}

			} else if (currChild.getTerm() instanceof XSWildcard) {
				// Element von sequence/choice kann ein Wildcard-Objekt sein,
				// z.B. 'xs:any'
				XSWildcard wildCard = currChild.getTerm().asWildcard();
				String currNamespaceStr = wildCard
						.apply(MySchemaWriter.WILDCARD_NS);

				Phrase currPhrase = new Phrase();
				currPhrase.add(getChunkTextBold("any"));
				currPhrase.add(getChunkText(" (" + getMinMaxStr(currChild)
						+ ")\n"));
				if (currNamespaceStr.length() > 0) {
					currPhrase.add(getChunkText(currNamespaceStr));
				}
				currList.add(new ListItem(currPhrase));
			}
		}
		return currList;
	}

	/**
	 * F�r die Attribute des aktuellen Typs wird eine Liste erzeugt und der
	 * angegebenen Sektion hinzugef�gt.
	 * 
	 * @param currType
	 *            Schemtyp, f�r den die Attribute bestimmt werden
	 * @param currSection
	 *            Aktuelle Sektion des PDF-Dokuments
	 */
	private void behandleAttribute(XSType currType, Section currSection) {
		if (currType.isComplexType()) {
			@SuppressWarnings("unchecked")
			Iterator itr1 = (Iterator) currType
					.asComplexType().iterateAttGroups();
			@SuppressWarnings("unchecked")
			Iterator itr2 = (Iterator) currType
					.asComplexType().iterateAttributeUses();

			if (itr1.hasNext() || itr2.hasNext()) {
				// Abstand
				currSection.add(getEmptyLineTextHalf());

				currSection.add(getParagraphTextBold("Attribute:"));

				List currList = new List(false, 12);
				currList.setListSymbol(bulletMain);

				while (itr1.hasNext()) {
					XSAttGroupDecl currAttr = itr1.next();
					String strAttribute = currAttr.getName();
					currList.add(new ListItem(getPhraseText(strAttribute)));
				}

				while (itr2.hasNext()) {
					XSAttributeDecl currAttr = itr2.next().getDecl();
					String strAttribute = currAttr.getName();
					// Typ kann lokal sein
					if (!currAttr.getType().isLocal()) {
						strAttribute += " ("
								+ getNameWithPrefix(currAttr.getType()) + ")";
					}
					currList.add(new ListItem(getPhraseText(strAttribute)));
				}
				currSection.add(currList);
			}
		}
	}

	/**
	 * Diese Methode erzeugt die Titelseite f�r das PDF-Dokument mit der
	 * Bezeichnung des Verfahrens.
	 * 
	 * @param bezVerfahren
	 *            Bezeichnung des profilierten Verfahrens
	 * @throws DocumentException
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	private void erzeugeTitelSeite() throws DocumentException,
			MalformedURLException, IOException {
		// Symbol, falls vorhanden
		String pathImage = "./logo_doku.png";
		try {
			// Image image =
			// Image.getInstance(PdfCreatorImpl.class.getResource(pathImage));
			Image image = Image.getInstance(pathImage);
			image.setAlignment(Element.ALIGN_RIGHT);
			docPdf.add(image);
		} catch (Exception e) {
			if (logger.isDebugEnabled()) {
				logger.debug("Fehler beim Einbinden der Grafik '" + pathImage
						+ "'.", e);
			}
		}
		docPdf.add(getEmptyLineText());

		// Restliche Texte werden im Event-Handler geschrieben

		// Seitenumbruch
		docPdf.newPage();
	}

	private String getCompositorStr(XSComplexType type) {
		XSParticle currParticle = null;
		if (type.asComplexType().getExplicitContent() != null) {
			currParticle = type.asComplexType().getExplicitContent()
					.asParticle();
		} else if (type.asComplexType().getContentType() != null) {
			currParticle = type.asComplexType().getContentType().asParticle();
		}
		if (currParticle != null) {
			XSModelGroup modelGroup = currParticle.getTerm().asModelGroup();
			Compositor compositor = modelGroup.getCompositor();
			if (compositor
					.equals(com.sun.xml.xsom.XSModelGroup.Compositor.SEQUENCE)) {
				return "Sequence";
			} else if (compositor
					.equals(com.sun.xml.xsom.XSModelGroup.Compositor.CHOICE)) {
				return "Choice";
			}
		}
		return "";
	}

	private String getMinMaxStr(XSParticle currParticle) {
		// minOccurs
		int minOccursChild = currParticle.getMinOccurs().intValue();
		String strminOccurs = "minOccurs: " + minOccursChild;
		// maxOccurs
		int maxOccursChild = currParticle.getMaxOccurs().intValue();
		String strMaxOccurs = "maxOccurs: " + maxOccursChild;
		if (maxOccursChild == -1) {
			strMaxOccurs = "maxOccurs: unbounded";
		}
		return strminOccurs + ", " + strMaxOccurs;
	}

	private Document initPdfWriterAndDocument(String filePath,
			boolean addHandlerHeaderFooter) throws FileNotFoundException,
			DocumentException {
		chapterCounter = 0;
		currPageNumber = 1;
		Document document = new Document();
		document.setMargins(40, 40, 55, 55);
		PdfWriter pdfWriter = PdfWriter.getInstance(document,
				new FileOutputStream(filePath));
		if (addHandlerHeaderFooter) {
			// Eventhandler f�r die Fu�zeile
			HeaderFooter hf = new HeaderFooter();
			pdfWriter.setPageEvent(hf);
		}
		document.open();
		return document;
	}

	private Paragraph getEmptyLineText() {
		return getEmptyLinesText(fontSizeText, 1);
	}

	private Paragraph getEmptyLineTextHalf() {
		return getEmptyLinesText(fontSizeTextHalf, 1);
	}

	private Paragraph getEmptyLinesText(int fontSize, int countLines) {
		Paragraph pg = new Paragraph("\n", FontFactory.getFont(
				fontNameStandard, fontSize, Font.NORMAL));
		for (int i = 1; i < countLines; i++) {
			pg.add(new Paragraph("", FontFactory.getFont(fontNameStandard,
					fontSize, Font.NORMAL)));
		}
		return pg;
	}

	private Chunk getChunkChapter(String text) {
		return new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeChapter, Font.BOLD));
	}

	private Chunk getChunkElement(String text) {
		return new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeElement, Font.BOLD));
	}

	private Chunk getChunkText(String text) {
		return new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.NORMAL));
	}

	private Chunk getChunkTextBold(String text) {
		return new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.BOLD));
	}

	private Chunk getChunkTextBoldWithReference(String text, String reference) {
		Chunk chunkText = new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.BOLD));
		// Referenz setzen
		chunkText.setLocalGoto(reference);
		// Unterstreichen
		chunkText.setUnderline(new BaseColor(0x00, 0x0f, 0xFF), 0.5f, 0.0f,
				-4f, 0.0f, PdfContentByte.LINE_CAP_BUTT);
		return chunkText;
	}

	private Chunk getChunkTextItalic(String text) {
		return new Chunk(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.ITALIC));
	}

	private Phrase getPhraseText(String text) {
		return new Phrase(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.NORMAL));
	}

	private Phrase getPhraseTextBold(String text) {
		return new Phrase(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.BOLD));
	}

	private Phrase getPhraseChapter(String text) {
		return new Phrase(text, FontFactory.getFont(fontNameStandard,
				fontSizeChapter, Font.BOLD));
	}

	private Phrase getPhraseChapterItalic(String text) {
		return new Phrase(text, FontFactory.getFont(fontNameStandard,
				fontSizeChapter, Font.BOLDITALIC));
	}

	private Phrase getPhraseHeaderFooter(String text) {
		return new Phrase(text, FontFactory.getFont(fontNameStandard,
				fontSizeFooter, Font.NORMAL));
	}

	private Paragraph getParagraphChapter(String text) {
		return new Paragraph(text, FontFactory.getFont(fontNameStandard,
				fontSizeChapter, Font.BOLD));
	}

	private Paragraph getParagraphTextBold(String text) {
		return new Paragraph(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.BOLD));
	}

	private Paragraph getParagraphTextItalic(String text) {
		return new Paragraph(text, FontFactory.getFont(fontNameStandard,
				fontSizeText, Font.ITALIC));
	}

	private String getNameWithPrefix(XSDeclaration decl) {
		return getNsPref(decl.getTargetNamespace()) + ":" + decl.getName();
	}

	private String getReferenceForElement(XSElementDecl element) {
		return element.hashCode() + "_" + getNameWithPrefix(element);
	}

	private String getNsPref(String nsUrl) {
		return configurator.getPropertyNamespace(nsUrl);
	}

	class HeaderFooter extends PdfPageEventHelper {

		String currChapterTitle = "";

		/**
		 * Initialize one of the headers, based on the chapter title; reset the
		 * page number.
		 * 
		 * @see com.itextpdf.text.pdf.PdfPageEventHelper#onChapter(com.itextpdf.text.pdf.PdfWriter,
		 *      com.itextpdf.text.Document, float, com.itextpdf.text.Paragraph)
		 */
		@Override
		public void onChapter(PdfWriter writer, Document document,
				float paragraphPosition, Paragraph title) {
			currChapterTitle = title.getContent();
		}

		/**
		 * Adds the header and the footer.
		 * 
		 * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter,
		 *      com.itextpdf.text.Document)
		 */
		@Override
		public void onEndPage(PdfWriter writer, Document document) {
			float posTopLine = document.top() + 10;
			float posTopText = document.top() + 15;
			float posBottomLine = document.bottomMargin() - 10;
			float posBottomText = document.bottomMargin() - 22;
			float posLeft = document.leftMargin();
			float posRight = document.getPageSize().getRight()
					- document.rightMargin();

			if (writer.getPageNumber() == 1) {
				// Titelseite

				PdfContentByte contentByte = writer.getDirectContent();

				// Titel des Verfahrens (ungef�hr in der Mitte der Seite)
				float posTitleX = document.getPageSize().getWidth() / 2;
				float posTitleY = document.getPageSize().getHeight() / 2;

				Phrase phraseTitle = getPhraseChapter("Schnittstellenspezifikation");
				ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER,
						phraseTitle, posTitleX, posTitleY + 30, 0);
				phraseTitle = getPhraseChapterItalic(bezVerfahren);
				ColumnText.showTextAligned(contentByte, Element.ALIGN_CENTER,
						phraseTitle, posTitleX, posTitleY, 0);

				// Datumszeile 'erstellt am' am Ende der Seite
				DateFormat dateFormat = new SimpleDateFormat(
						"dd.MM.yyyy HH:mm:ss");
				Phrase phraseDatum = getPhraseText("erstellt am "
						+ dateFormat.format(new Date()));
				ColumnText.showTextAligned(contentByte, Element.ALIGN_RIGHT,
						phraseDatum, posRight, document.bottomMargin(), 0);

			} else if (writer.getPageNumber() > 1) {
				// Kopf- und Fu�zeile erst ab der zweiten Seite ...

				PdfContentByte contentByte = writer.getDirectContent();

				// Kopfzeile, Linie
				contentByte.moveTo(posLeft, posTopLine);
				contentByte.lineTo(posRight, posTopLine);
				contentByte.stroke();

				// Kopfzeile, Dateiname
				File currFile = new File(dateiname);
				Phrase phraseDateiname = getPhraseHeaderFooter(currFile
						.getName());
				ColumnText.showTextAligned(contentByte, Element.ALIGN_LEFT,
						phraseDateiname, posLeft, posTopText, 0);

				// Kopfzeile, Erstellungsdatum
				DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
				Phrase phraseDatum = getPhraseHeaderFooter(dateFormat
						.format(new Date()));
				ColumnText.showTextAligned(contentByte, Element.ALIGN_RIGHT,
						phraseDatum, posRight, posTopText, 0);

				// Fu�zeile, Linie
				contentByte.moveTo(posLeft, posBottomLine);
				contentByte.lineTo(posRight, posBottomLine);
				contentByte.stroke();

				// Fu�zeile, aktuelles Kapitel
				if (currChapterTitle.length() > 0) {
					Phrase phraseFooterChapterTitle = getPhraseHeaderFooter(currChapterTitle);
					ColumnText
							.showTextAligned(contentByte, Element.ALIGN_LEFT,
									phraseFooterChapterTitle, posLeft,
									posBottomText, 0);
				}

				// Fu�zeile, Seitenzahl
				Phrase phraseFooter = getPhraseHeaderFooter(""
						+ writer.getPageNumber());
				ColumnText.showTextAligned(contentByte, Element.ALIGN_RIGHT,
						phraseFooter, posRight, posBottomText, 0);
			}

			// Seitenzahl hochz�hlen
			PdfCreatorImpl.this.currPageNumber++;
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy