Package de.archivator.beans

Source Code of de.archivator.beans.PdfExportBean

/*
* This file is part of archivator, a software system for managing
* and retrieving archived items.
*
* Copyright (C) 2012  Jan Müller
*
*  This program is free software: you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package de.archivator.beans;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;

import de.archivator.entities.Archivale;
import de.archivator.entities.Dokumentart;
import de.archivator.entities.Name;
import de.archivator.entities.Körperschaft;

/**
* Die PdfExportBean dient zum generieren einer PDF-Datei, die die Informationen
* zu einem Archivale enthält
*
* @author Jan Müller
*/
@Named(value = "pdfExportBean")
@RequestScoped
public class PdfExportBean {

  @Inject
  private DetailBean detailBean;
  @Inject
  private RechercheBean rechercheBean;
  private List<Archivale> archivalien;
  private Document document;
  private FacesContext context;
  private String filename = "document.pdf";
  private ByteArrayOutputStream byteArrayOutputStream;

  private boolean printPersonen;
  private boolean printDatum;
  private boolean printKörperschaften;
  private boolean printDokumentarten;

  /**
   * Die Methode createPdfFromRecord dient zum Erzeugen einer PDF-Datei aus
   * einem einzelnen Archiv-Datensatz
   *
   * @param context
   *            Der FacesContext
   * @throws IOException
   */
  public void createPdfFromRecord(FacesContext context) throws IOException {
    this.context = context;
    archivalien = new ArrayList<Archivale>();
    archivalien.add(detailBean.getAktuellesArchivale());
    if (archivalien.size() > 0) {
      createDocument();
      createResponse();
    }
  }

  /**
   * Die Methode createPdfFromList dient zum Erzeugen einer PDF-Datei aus
   * einem Recherche-Ergebnis
   *
   * @throws IOException
   */
  public void createPdfFromList(FacesContext context) throws IOException {
    this.context = context;
    archivalien = rechercheBean.getArchivalien();
    filename = "Suche nach ";

    if (archivalien.size() > 0) {
      createDocument();
      createResponse();
    }
  }

  /**
   * Die Methode createDocument erzeugt ein Pdf-Dokument und füllt sie mit den
   * Inhalten aus der Liste "archivalien"
   */
  private void createDocument() {
    try {
      filename = "Suche nach: ";
      for (Archivale a : archivalien) {
        filename = filename +" "+ a.getBetreff();
      }
      document = new Document();
      byteArrayOutputStream = new ByteArrayOutputStream();
      PdfWriter.getInstance(document, byteArrayOutputStream);
      document.open();
      for (int i = 0; i < archivalien.size(); i++) {
        addContentFrom(archivalien.get(i));
      }
      document.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * Die Methode addDetails dient zum Hinzufügen von Details aus einem
   * Archivale in ein Dokument.
   *
   * @param aktuellesArchivale
   *            Das aktuelle Archivale, dessen Details zum PDF-Dokument
   *            hinzugefügt werden soll.
   */
  private void addContentFrom(Archivale aktuellesArchivale)
      throws DocumentException {
    LineSeparator UNDERLINE = new LineSeparator(1, 100, null,
        Element.ALIGN_CENTER, -2);

    // beim ersten Archivdatensatz einen Absatz hinzufügen,
    // da sonst Leerzeilen nicht eingefügt werden
    if (archivalien.indexOf(aktuellesArchivale) == 0) {
      document.add(new Paragraph(""));
    }

    document.add(Chunk.NEWLINE);
    document.add(UNDERLINE);
    document.add(Chunk.NEWLINE);

    document.add(new Paragraph("Betreff: "
        + aktuellesArchivale.getBetreff()));
    document.add(Chunk.NEWLINE);
    document.add(new Paragraph("Inhalt: " + aktuellesArchivale.getInhalt()));
    document.add(Chunk.NEWLINE);

    document.add(new Paragraph("Mappe: " + aktuellesArchivale.getMappe()
        + " Schubfach: " + aktuellesArchivale.getSchubfach()));
    document.add(Chunk.NEWLINE);
    if (printDatum) {
      document.add(new Paragraph("Datum (Jahr): "
          + aktuellesArchivale.getVonJahr() + " - "
          + aktuellesArchivale.getBisJahr()));
      document.add(Chunk.NEWLINE);
    }

    if (printPersonen) {
      List<Name> names = aktuellesArchivale.getNamen();
      if (names.size() > 0) {
        document.add(new Paragraph("Personen: "));
        for (Name n : names) {
          document.add(new Paragraph("  - " + n.getVorname() + " "
              + n.getNachname()));
        }
        document.add(Chunk.NEWLINE);
      }
    }

    if (printKörperschaften) {
      List<Körperschaft> körperschaften = aktuellesArchivale
          .getKörperschaften();
      if (körperschaften.size() > 0) {
        document.add(new Paragraph("Körperschaften: "));
        for (Körperschaft o : körperschaften) {
          document.add(new Paragraph("Körperschaften:" + o.getName()));
        }
        document.add(Chunk.NEWLINE);
      }

    }

    if (printDokumentarten) {
      List<Dokumentart> dokumentarten = aktuellesArchivale
          .getDokumentarten();
      if (dokumentarten.size() > 0) {
        document.add(new Paragraph("Dokumentarten: "));
        for (Dokumentart d : dokumentarten) {
          document.add(new Paragraph("Dokumentarten:" + d.getName()));
        }
        document.add(Chunk.NEWLINE);
      }
    }

    if (archivalien.indexOf(aktuellesArchivale) == archivalien.size() - 1) {
      document.add(UNDERLINE);
      document.add(Chunk.NEWLINE);
    }
  }

  /**
   * Schreibt den Inhalt des vorbereiteten byteArrayOutputStreams in den
   * Response, stellt sicher, dass der Inhalt an den Klienten versendet wird
   * und schließt den Response dann JSF-seitig ab.
   */
  private void createResponse() {
    try {
      HttpServletResponse response = (HttpServletResponse) this.context
          .getExternalContext().getResponse();
      response.setContentType("application/pdf");
      // den Browser informieren, dass er eine neue Datei erhält und sie
      // herunterladen soll, anstatt sie auf der Seite darzustellen
      response.setHeader("Content-disposition", "attachment; filename="
          + filename);
      // the contentlength
      response.setContentLength(byteArrayOutputStream.size());
      // write ByteArrayOutputStream to the ServletOutputStream
      ServletOutputStream os = response.getOutputStream();
      byteArrayOutputStream.writeTo(os);
      os.flush();
      os.close();
      context.responseComplete();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public boolean isPrintPersonen() {
    return printPersonen;
  }

  public void setPrintPersonen(boolean printPersonen) {
    this.printPersonen = printPersonen;
  }

  public boolean isPrintDatum() {
    return printDatum;
  }

  public void setPrintDatum(boolean printDatum) {
    this.printDatum = printDatum;
  }

  public boolean isPrintKörperschaften() {
    return printKörperschaften;
  }

  public void setPrintKörperschaften(boolean printKörperschaften) {
    this.printKörperschaften = printKörperschaften;
  }

  public boolean isPrintDokumentarten() {
    return printDokumentarten;
  }

  public void setPrintDokumentarten(boolean printDokumentarten) {
    this.printDokumentarten = printDokumentarten;
  }
}
TOP

Related Classes of de.archivator.beans.PdfExportBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.