/******************************************************************************* * Copyright 2014 Miami-Dade County * * 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.sharegov.cirm.utils; import java.io.IOException; import java.io.OutputStream; import java.util.List; import mjson.Json; import com.itextpdf.text.Anchor; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chapter; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Section; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; public class PDFExportUtil { private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD); private static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL, BaseColor.RED); private static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD); private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD); private static Font smallFont = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.NORMAL); private static void addMetaData(Document doc) { doc.addTitle("My title"); doc.addSubject("My subject"); doc.addKeywords("itext, java, export"); doc.addAuthor(""); doc.addCreator(""); } private static void createTable(Section subCatPart, Json allData) throws DocumentException { Json metaData = allData.at("metaData"); PdfPTable table = null; PdfPCell c1 = null; int columns = metaData.at("columns").asInteger(); table = new PdfPTable(columns); table.setWidthPercentage(100); if(columns == 9) { int[] widths = {10, 20, 12, 12, 4, 6, 6, 8, 8}; table.setWidths(widths); } else { int[] widths = {10, 25, 12, 12, 4, 6, 6, 8}; table.setWidths(widths); } // t.setBorderColor(BaseColor.GRAY); // t.setPadding(4); // t.setSpacing(4); // t.setBorderWidth(1); c1 = new PdfPCell(new Phrase(metaData.at("boid").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("type").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("fullAddress").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("city").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("zip").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("hasStatus").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("createdDate").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); c1 = new PdfPCell(new Phrase(metaData.at("lastActivityUpdatedDate").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); if(columns == 9) { c1 = new PdfPCell(new Phrase(metaData.at("gisColumn").asString(), smallBold)); c1.setHorizontalAlignment(Element.ALIGN_CENTER); c1.setBackgroundColor(BaseColor.LIGHT_GRAY); table.addCell(c1); } table.setHeaderRows(1); List<Json> data = allData.at("data").asJsonList(); for(Json dataValue : data) { if(!dataValue.at("hasCaseNumber").asString().isEmpty()) c1 = new PdfPCell(new Phrase(dataValue.at("hasCaseNumber").asString(), smallFont)); else c1 = new PdfPCell(new Phrase(GenUtils.makeCaseNumber(dataValue.at("boid").asLong()), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("label").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("fullAddress").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("Street_Address_City").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("Zip_Code").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("hasStatus").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("hasDateCreated").asString(), smallFont)); table.addCell(c1); c1 = new PdfPCell(new Phrase(dataValue.at("lastActivityUpdatedDate").asString(), smallFont)); table.addCell(c1); if(columns == 9) { c1 = new PdfPCell(new Phrase(dataValue.at("gisColumn").asString(), smallFont)); table.addCell(c1); } } subCatPart.add(table); } public void exportData(OutputStream out, Json data) throws IOException { try { Document doc = new Document(PageSize.LETTER.rotate()); PdfWriter.getInstance(doc, out); doc.open(); //addMetaData(doc); addContent(doc, data); doc.close(); } catch (DocumentException e) { e.printStackTrace(); } } private static void addContent(Document doc, Json data) throws DocumentException { Anchor anchor = new Anchor(); //new Anchor("First Chapter", catFont); //anchor.setName("First Chapter Anchor"); Chapter catPart = new Chapter(new Paragraph(anchor), 1); catPart.setNumberDepth(0); Paragraph subPara = new Paragraph(); //new Paragraph("SubCategory 1", subFont); Section subCatPart = catPart.addSection(subPara); subCatPart.setNumberDepth(0); createTable(subCatPart, data); //Add everything to the document doc.add(catPart); } }