/*
* Copyright 2006-2014 the original author or authors.
*
* Licensed 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 org.jrecruiter.web.views;
import java.awt.Color;
import java.awt.Image;
import java.text.DateFormat;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.jrecruiter.model.Job;
import org.jrecruiter.web.actions.util.JobDetailPageEvents;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
/**
* @author Gunnar Hillert
*/
public class JobDetailPdfView extends AbstractPdfView {
//~~~~~Initialization~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
protected void prepareWriter(Map<String, Object> model, PdfWriter writer,
HttpServletRequest request) throws DocumentException {
super.prepareWriter(model, writer, request);
writer.setPageEvent(new JobDetailPageEvents());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
protected void buildPdfDocument(final Map<String, Object> model,
final Document document,
final PdfWriter pdfWriter,
final HttpServletRequest request,
final HttpServletResponse response)
throws Exception {
final Job job = (Job)model.get("job");
final Image googleMapImage = (Image)model.get("googleMapImage");
super.setContentType("application/pdf");
document.addCreationDate();
document.addAuthor("www.jRecruiter.org (Gunnar Hillert)");
document.addTitle("jRecruiter Job Posting Detail");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
if (job == null) {
response.setHeader("Content-disposition",
"attachment; filename=" +
"No_Job.pdf");
document.add(new Paragraph("No job posting found for the provided id."));
} else {
response.setHeader("Content-disposition",
"attachment; filename=" + "JobDetail_" + job.getId() + ".pdf");
//~~~~Render Job Summary~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
this.addPdfHeader(pdfWriter, document, "Summary");
final PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(100);
table.setSpacingBefore(10);
table.setWidths(new float[]{25, 75});
addPdfRow(table, "Job Id:", String.valueOf(job.getId()));
final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, request.getLocale());
addPdfRow(table, "Updated:", String.valueOf(dateFormat.format(job.getUpdateDate())));
if (StringUtils.isNotBlank(job.getJobTitle())) {
addPdfRow(table, "Job Title:", job.getJobTitle());
}
if (StringUtils.isNotBlank(job.getBusinessName())) {
addPdfRow(table, "Business Name:", job.getBusinessName());
}
if (job.getOfferedBy() != null) {
addPdfRow(table, "Job Offered By:", job.getOfferedBy().getName());
}
if (StringUtils.isNotBlank(job.getRegionForDisplay())) {
addPdfRow(table, "Job Location:", job.getRegionForDisplay());
}
if (StringUtils.isNotBlank(job.getIndustryForDisplay())) {
addPdfRow(table, "Industry:", job.getIndustryForDisplay());
}
if (StringUtils.isNotBlank(job.getSalary())) {
addPdfRow(table, "Salary:", job.getSalary());
}
if (StringUtils.isNotBlank(job.getBusinessPhone())) {
addPdfRow(table, "Phone:", job.getBusinessPhone());
}
if (StringUtils.isNotBlank(job.getBusinessPhoneExtension())) {
addPdfRow(table, "Phone Extension:", job.getBusinessPhoneExtension());
}
if (StringUtils.isNotBlank(job.getBusinessEmail())) {
addPdfRow(table, "Email:", job.getBusinessEmail());
}
if (StringUtils.isNotBlank(job.getBusinessAddress1())) {
addPdfRow(table, "Address 1:", job.getBusinessAddress1());
}
if (StringUtils.isNotBlank(job.getBusinessAddress2())) {
addPdfRow(table, "Address 2:", job.getBusinessAddress2());
}
if (StringUtils.isNotBlank(job.getBusinessCity())) {
addPdfRow(table, "City:", job.getBusinessCity());
}
if (StringUtils.isNotBlank(job.getBusinessState())) {
addPdfRow(table, "State:", job.getBusinessState());
}
if (StringUtils.isNotBlank(job.getBusinessZip())) {
addPdfRow(table, "Zip:", job.getBusinessZip());
}
addPdfRow(table, "Website:", job.getWebsite());
document.add(table);
//~~~~~Render Map Location if available~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (job.getUsesMap() && googleMapImage != null) {
this.addPdfHeader(pdfWriter, document, "Job Location");
com.lowagie.text.Image img = com.lowagie.text.Image.getInstance(googleMapImage,
Color.WHITE);
img.scalePercent(75);
img.setBorder(Rectangle.BOX);
img.enableBorderSide(Rectangle.BOX);
img.setBorderColor(Color.BLACK);
img.setBorderWidth(1);
document.add(img);
}
//~~~~~Render Job Description~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
this.addPdfHeader(pdfWriter, document, "Job Description");
Paragraph jobDescription = new Paragraph(job.getDescription());
document.add(jobDescription);
//~~~~~Render Job Restrictions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (StringUtils.isNotBlank(job.getJobRestrictions())) {
this.addPdfHeader(pdfWriter, document, "Job Restrictions");
Paragraph jobRestrictions = new Paragraph(job.getJobRestrictions());
document.add(jobRestrictions);
}
}
}
//~~~~~Helper~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private void addPdfHeader(PdfWriter pdfWriter, Document document, String headerString) throws DocumentException {
// final Paragraph jobLocationHeader = new Paragraph(new Phrase(headerString, FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD)));
// document.add(jobLocationHeader);
//
// float pos = pdfWriter.getVerticalPosition(false) - 2;
//
// PdfContentByte cb = pdfWriter.getDirectContent();
//
// cb.moveTo(document.leftMargin(), pos);
// cb.lineTo(document.right()+document.rightMargin(), pos);
// cb.setColorStroke(Color.RED);
// cb.stroke();
//
// cb.moveTo(document.leftMargin(), pos - 40);
}
private void addPdfRow(PdfPTable table, String label, String value) throws DocumentException {
final PdfPCell labelCell = new PdfPCell(new Phrase(label));
final PdfPCell valueCell = new PdfPCell(new Phrase(value));
labelCell.disableBorderSide(PdfPCell.LEFT);
labelCell.disableBorderSide(PdfPCell.TOP);
labelCell.disableBorderSide(PdfPCell.RIGHT);
labelCell.disableBorderSide(PdfPCell.BOTTOM);
valueCell.disableBorderSide(PdfPCell.LEFT);
valueCell.disableBorderSide(PdfPCell.TOP);
valueCell.disableBorderSide(PdfPCell.RIGHT);
valueCell.disableBorderSide(PdfPCell.BOTTOM);
table.addCell(labelCell);
table.addCell(valueCell);
}
}