package javacodebook.server.pdf;

import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter;

/**
 *  Ausgabe eines typischen Berichts als PDF-Datei.
 */
public class PdfServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        response.setContentType("application/pdf");
        ServletOutputStream out = response.getOutputStream();

        //Ein PDF-Dokument wird erzeugt, Seitengröße sowie Ränder (l,r,o,u)
        //werden gesetzt
        Document document = new Document(PageSize.A4, 72, 35, 50, 50);
        try {
            //Es wird ein PDFWriter erzeugt, der auf Änderungen im PDF-Dokument
            //lauscht und diese direkt in den angegebenen OutputStream schreibt
            PdfWriter.getInstance(document, out);

            //Eine Fusszeile mit Seitenzahlen wird erzeugt.
            HeaderFooter footer = new HeaderFooter(new Phrase("Seite "), true);
            footer.setBorder(Rectangle.NO_BORDER);
            footer.setAlignment(Element.ALIGN_RIGHT);
            document.setFooter(footer);

            //Das Dokument wird geöffnet
            document.open();

            //Eine Tabellarische Auflistung über mehrere Seiten hinweg wird
            //erzeugt und ausgegeben. Dabei wird jeweils eine festgelegte
            //Anzahl Zeilen pro Seite ausgegeben.
            int rows = 100;
            int pageLength = 24;
            Table table = writePageTop(document, pageLength);
            for(int i = 0; i < rows; i++) {
                String[] row = getTableRow();
                table.addCell(row[0]);
                table.addCell(row[1]);
                table.addCell(row[2]);
                if((i+1) % pageLength == 0) {
                    document.add(table);
                    document.newPage();
                    table = writePageTop(document, pageLength);
                }
            }
            document.add(table);
        }
        catch(DocumentException e) {
            e.printStackTrace(System.out);
        }
        document.close();
        out.close();
        //Puffer leeren
        response.flushBuffer();
    }

    private Table writePageTop(Document document, int pageLength)
    throws DocumentException {
        document.add(new Paragraph("Adressliste"));
        Table table = new Table(3, pageLength);
        table.setAlignment(Element.ALIGN_LEFT);
        table.setPadding(2);
        table.setBorderWidth(1);
        table.addCell("Name");
        table.addCell("Adresse");
        table.addCell("Telefon");
        return table;
    }

    private String[] getTableRow() {
        return new String[] {
            javacodebook.core.stringtools.StringToolbox.randomWord(15),
            javacodebook.core.stringtools.StringToolbox.randomWord(12),
            "0" + new Random().nextInt(1000) + "/"
            + new Random().nextInt(1000000)
        };
    }
}
