/*
* This file is part of the aidGer project.
*
* Copyright (C) 2010-2013 The aidGer Team
*
* 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.aidger.utils.pdf;
import static de.aidger.utils.Translation._;
import java.awt.Desktop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.AcroFields.FieldPosition;
import de.aidger.model.Runtime;
import de.aidger.utils.DateUtils;
import de.aidger.view.UI;
/**
* This class converts activity reports to a format for itext and exports them
*
* @author aidGer Team
*/
public class ActivityReportConverter {
/**
* Whether the file was created successfully.
*/
private boolean fileCreated = false;
/**
* The name of the assistant.
*/
private final String assistant;
/**
* The table rows that this report should contain.
*/
private final ArrayList<String[]> tableRows;
/**
* The stamper used to stamp the fields.
*/
private PdfStamper stamper;
/**
* The content byte used for this report.
*/
private PdfContentByte contentByte;
/**
* The reader used to read from the template.
*/
private PdfReader reader;
/**
* The AcroFields which is used to write data to the fields of the template.
*/
private AcroFields form;
/**
* Initializes a new ActivityReportConverter and creates the .pdf file.
*
* @param file
* The file for the report.
*/
public ActivityReportConverter(File file, ArrayList<String[]> tableRows,
String assistant) {
this.tableRows = tableRows;
this.assistant = assistant;
file = checkExtension(file);
makeNewDocument(file);
if (fileCreated) {
stampFields();
writeLogo();
createTable();
try {
stamper.close();
} catch (DocumentException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
/*
* Open the created document if the setting is enabled with the
* specified pdf viewer.
*/
if (Runtime.getInstance().getOption("auto-open").equals("true")) {
try {
java.lang.Runtime.getRuntime().exec(
new String[] {
Runtime.getInstance().getOption("pdf-viewer"),
file.getAbsolutePath() });
} catch (IOException e) {
try {
Desktop.getDesktop().open(file);
} catch (IOException e1) {
UI.displayError(_("No pdf viewer could be found!"));
}
}
}
}
}
/**
* Adds the specific values to the fields in the template.
*/
private void stampFields() {
form = stamper.getAcroFields();
try {
Calendar calendar = Calendar.getInstance();
BaseFont fieldFont = BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.CP1252, false);
BaseFont fatFieldFont = BaseFont.createFont(
BaseFont.HELVETICA_BOLD, BaseFont.CP1252, false);
form.setFieldProperty("CreatorName", "textfont", fieldFont, null);
form.setFieldProperty("CreatorName", "textsize", 12.0f, null);
form.setFieldProperty("CreatorName", "textcolor", BaseColor.BLACK,
null);
form.setField("CreatorName", Runtime.getInstance()
.getOption("name"));
form.setFieldProperty("AssistantName", "textfont", fatFieldFont,
null);
form.setFieldProperty("AssistantName", "textsize", 12.0f, null);
form.setFieldProperty("AssistantName", "textcolor",
BaseColor.BLACK, null);
form.setField("AssistantName", assistant);
form.setFieldProperty("Date", "textfont", fieldFont, null);
form.setFieldProperty("Date", "textsize", 12.0f, null);
form.setFieldProperty("Date", "textcolor", BaseColor.BLACK, null);
form.setField("Date", DateUtils.formatDate(calendar.getTime()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Checks if the extension of the file is in fact .pdf. If not, it adds the
* .pdf extension to the file name.
*
* @param file
* The file to check.
* @return The file name with the correct extension.
*/
private File checkExtension(File file) {
String fileName = file.getName();
int fileExtensionStart = fileName.lastIndexOf('.');
String fileExtension = fileName.substring(fileExtensionStart + 1);
if (!fileExtension.equals("pdf")) {
return new File(file.getPath() + ".pdf");
}
return file;
}
/**
* Creates a new document.
*
* @param file
* The file to create.
*/
private void makeNewDocument(File file) {
try {
File template = new File(Runtime.getInstance().getConfigPath()
+ "/templates/ActivityReportTemplate.pdf");
URL templateURL = null;
if (template.exists()) {
templateURL = template.toURI().toURL();
} else {
templateURL = getClass().getResource(
"/de/aidger/res/pdf/ActivityReportTemplate.pdf");
}
if(templateURL == null) {
throw new FileNotFoundException(_("The report template could not be loaded.") + " "
+ _("Please make sure that a fitting template exists in the template folder."));
}
reader = new PdfReader(templateURL);
stamper = new PdfStamper(reader, new FileOutputStream(file));
fileCreated = true;
contentByte = stamper.getOverContent(1);
} catch (FileNotFoundException e1) {
if(e1.getMessage() != null) {
UI.displayError(e1.getMessage());
} else {
UI.displayError(_("File could not be created.") + " "
+ _("Please close all processes that are using the file."));
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Writes the logos and the address of the institute.
*/
private void writeLogo() {
try {
Font generatedByFont = new Font(BaseFont.createFont(
BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED), 8);
Image aidger = Image.getInstance(getClass().getResource(
"/de/aidger/res/pdf/AidgerLogo.png"));
aidger.scaleAbsolute(80.0f, 20.0f);
PdfPTable table = new PdfPTable(2);
table.setTotalWidth(reader.getPageSize(1).getRight());
PdfPCell cell = new PdfPCell(new Phrase(_("Generated by: "),
generatedByFont));
cell.setBorder(0);
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.setPaddingBottom(5);
cell.setVerticalAlignment(Element.ALIGN_BOTTOM);
table.addCell(cell);
cell = new PdfPCell(Image.getInstance(aidger));
cell.setHorizontalAlignment(Element.ALIGN_LEFT);
cell.setBorder(0);
table.addCell(cell);
table.writeSelectedRows(0, -1, 0, 25, contentByte);
} catch (BadElementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Creates the table of employments.
*/
private void createTable() {
try {
Font tableTitleFont = new Font(BaseFont.createFont(
BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.EMBEDDED),
10);
String[] tableTitles = { "Zeitraum", "Veranstaltung", "Umfang" };
PdfPTable contentTable = new PdfPTable(1);
PdfPTable titleTable = new PdfPTable(
new float[] { 0.2f, 0.6f, 0.2f });
/*
* Create the titles of the table entries.
*/
for (int i = 0; i < tableTitles.length; i++) {
PdfPCell cell = new PdfPCell(new Phrase(tableTitles[i],
tableTitleFont));
titleTable.addCell(cell);
}
PdfPCell cell = new PdfPCell(titleTable);
cell.setPaddingTop(10.0f);
cell.setPaddingBottom(2.0f);
cell.setBorder(0);
contentTable.addCell(cell);
cell = new PdfPCell(addRows());
cell.setBorder(0);
contentTable.addCell(cell);
float xPos = 60, yPos = 500, width = reader.getPageSize(1)
.getWidth() - 120f;
if (form.getFieldPositions("TableField") != null) {
FieldPosition position = form.getFieldPositions("TableField")
.get(0);
xPos = position.position.getLeft();
yPos = position.position.getTop();
width = position.position.getWidth();
}
contentTable.setTotalWidth(width);
contentTable.writeSelectedRows(0, -1, xPos, yPos, contentByte);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Adds the rows of employments to the table.
*/
private PdfPTable addRows() {
PdfPTable contentTable = new PdfPTable(new float[] { 0.2f, 0.6f, 0.2f });
try {
Font tableContentFont = new Font(BaseFont.createFont(
BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.EMBEDDED), 9);
for (String[] row : tableRows) {
for (int i = 0; i < row.length; i++) {
PdfPCell cell = new PdfPCell(new Phrase(row[i],
tableContentFont));
cell.setPaddingBottom(5);
contentTable.addCell(cell);
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return contentTable;
}
}