/**
 * Written by Bruno Lowagie as an extra example for the book
 * 'iText in Action'.
 */

package test;

import java.io.FileOutputStream;
import java.io.IOException;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;

public class BatchFormFill extends PdfPageEventHelper {
	
	public static final String ADDRESS = "address";
	public static final String CARD_NUMBER = "cardNumber";
	public static final String CHIP_NUMBER = "chipNumber";
	public static final String CARD_VALIDITY_BEGIN = "cardValidityBegin";
	public static final String CARD_VALIDITY_END = "cardValidityEnd";
	public static final String CARD_DELIVERY_MUNICIPALITY = "cardDeliveryMunicipality";
	public static final String NATIONAL_NUMBER = "nationalNumber";
	public static final String NAME = "name";
	public static final String TWO_FIRST_FIRST_NAMES = "twoFirstFirstNames";
	public static final String FIRST_LETTER_THIRD_FIRST_NAME = "firstLetterThirdFirstName";
	public static final String NATIONALITY = "nationality";
	public static final String BIRTH_LOCATION = "birthLocation";
	public static final String BIRTH_DATE = "birthDate";
	public static final String SEX ="sex";
	public static final String MUNICIPALITY = "municipality";
	public static final String NOBLE_CONDITION = "nobleCondition";
	public static final String DOCUMENT_TYPE = "documentType";
	public static final String SPECIAL_STATUS = "specialStatus";
	public static final String ZIP = "zip";
	
	public static final String[] keys = { NAME, TWO_FIRST_FIRST_NAMES, BIRTH_DATE, SEX, BIRTH_LOCATION, NATIONALITY, ADDRESS, MUNICIPALITY, ZIP };
	private Rectangle[] coordinates = new Rectangle[keys.length];
	private PdfImportedPage template;
	private PdfContentByte canvas;
	
	public void onOpenDocument(PdfWriter writer, Document doc) {
		try {
			canvas = writer.getDirectContentUnder();
			PdfReader reader = new PdfReader("EIDFormTemplate.pdf");
			template = writer.getImportedPage(reader, 1);
			AcroFields fields = reader.getAcroFields();
			for (int i = 0; i < keys.length; i++) {
				float[] positions = fields.getFieldPositions(keys[i]);
				coordinates[i] = new Rectangle(positions[1], positions[2] + 3, positions[3], positions[4] + 3);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void onEndPage(PdfWriter writer, Document doc) {
		canvas.addTemplate(template, 0, 0);
	}

	public static void main(String[] args) {

		String[][] values = {
				{ "Specimen", "Laura Aurora", "03-03-1970", "Female", "Foobar", "Foobarese", "Movie Drive 1", "Foobar", "70084" },
				{ "Wayne", "Bruce", "05-05-1950", "Male", "Gotham City", "American", "Wayne Street 2", "Gotham City", "1234" },
				{ "Bond", "James", "07-07-1960", "Male", "Manchester", "British", "Bond Street 007", "London", "1000" }
			};
		
		Document document = new Document();
		try {
			BatchFormFill batch = new BatchFormFill();
			PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("batch.pdf"));
			writer.setPageEvent(batch);
			document.open();
			PdfContentByte content = writer.getDirectContent();
			BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
			ColumnText ct = new ColumnText(content);
			for (int i = 0; i < values.length; i++) {
				// you can add text with showTextAligned
				content.beginText();
				content.setFontAndSize(bf, 12);
				content.showTextAligned(Element.ALIGN_CENTER, "page " + (i + 1), document.getPageSize().width() / 2, 36, 0);
				content.endText();
				for (int j = 0; j < values[i].length; j++) {
					// you can add text with ColumnText
					ct.setSimpleColumn(new Phrase(values[i][j]),
						batch.coordinates[j].left(), batch.coordinates[j].bottom(), 
						batch.coordinates[j].right(), batch.coordinates[j].top(),
						16, Element.ALIGN_LEFT);
					ct.go();
				}
				document.newPage();
			}
		} catch (DocumentException de) {
			System.err.println(de.getMessage());
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}
		document.close();
	}

	public void tableLayout(PdfPTable table, float[][] width, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
		float widths[] = width[0];
        PdfContentByte cb = canvases[PdfPTable.TEXTCANVAS];
        cb.rectangle(widths[0] - 5, heights[heights.length - 1] - 5, widths[widths.length - 1] - widths[0] + 10, heights[0] - heights[heights.length - 1] + 10);
        cb.stroke();
	}		
}