/*
* jMemorize - Learning made easy (and fun) - A Leitner flashcards tool
* Copyright(C) 2004-2008 Riad Djemili and contributors
*
* 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 1, 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package jmemorize.core.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.logging.Logger;
import jmemorize.core.Card;
import jmemorize.core.Category;
import jmemorize.core.Lesson;
import jmemorize.core.Main;
import jmemorize.core.Settings;
import jmemorize.gui.swing.CardFont.FontType;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.rtf.RtfWriter2;
/**
* @author jan stamer
* @author djemili
*/
public class PdfRtfBuilder
{
private final static int PDF_MODE = 0;
private final static int RTF_MODE = 1;
// These get set in export() prior to building the pdf/rtf
private static Logger logger;
private static Font frontFont;
private static Font backFont;
/**
* Export lesson to pdf
*
* @param lesson given lesson
* @param file resulting pdf file
* @throws IOException writing to file fails
* @throws DocumentException
*/
public static void exportLessonToPDF(Lesson lesson, File file) throws IOException
{
export(lesson, PDF_MODE, file);
}
public static void exportLessonToRTF(Lesson lesson, File file) throws IOException
{
export(lesson, RTF_MODE, file);
}
private static void export(Lesson lesson, int mode, File file) throws IOException
{
logger = Main.getLogger();
FontFactory.registerDirectories();
// set up the fonts we will use to write the front and back of cards
String frontFontName = Settings.loadFont(FontType.CARD_FRONT).getFont().getFamily();
frontFont = FontFactory.getFont(frontFontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
if (frontFont == null)
{
logger.warning("FontFactory returned null (front) font for: " + frontFontName);
}
String backFontName = Settings.loadFont(FontType.CARD_FLIP).getFont().getFamily();
backFont = FontFactory.getFont(backFontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
if (backFont == null)
{
logger.warning("FontFactory returned null (back) font for: " + backFontName);
}
try
{
Document doc = new Document();
OutputStream out = new FileOutputStream(file);
switch(mode)
{
case PDF_MODE:
PdfWriter.getInstance(doc, out);
break;
case RTF_MODE:
RtfWriter2.getInstance(doc, out);
break;
}
doc.setHeader(new HeaderFooter(new Phrase(file.getName()), false));
doc.open();
// add cards in subtrees
List<Category> subtree = lesson.getRootCategory().getSubtreeList();
for (Category category : subtree)
{
writeCategory(doc, category);
}
doc.close();
}
catch (Throwable t)
{
throw (IOException)new IOException("Could not export to PDF").initCause(t);
}
}
/**
* Adds given category to document
*
* @param doc document to add to
* @param category given category
*/
private static void writeCategory(Document doc, Category category)
throws DocumentException
{
// ignore empty categories
if (category.getLocalCards().size() == 0)
{
return;
}
writeCategoryHeader(doc, category);
for (Card card : category.getLocalCards())
{
writeCard(doc, card);
}
}
private static void writeCategoryHeader(Document doc, Category category)
throws DocumentException
{
Chunk chunk = new Chunk(category.getPath());
chunk.setFont(new Font(Font.HELVETICA, 12, Font.BOLD));
Paragraph paragraph = new Paragraph(chunk);
paragraph.setSpacingBefore(1f);
doc.add(paragraph);
}
/**
* Adds given card to document
*
* @param doc document to add to
* @param card given card
*/
private static void writeCard(Document doc, Card card)
throws DocumentException
{
Table table = new Table(2);
table.setPadding(3f);
table.setBorderWidth(1.0f);
table.setTableFitsPage(true);
table.complete();
Phrase front = new Phrase(card.getFrontSide().getText().getUnformatted(), frontFont);
table.addCell(front);
Phrase back = new Phrase(card.getBackSide().getText().getUnformatted(), backFont);
table.addCell(back);
doc.add(table);
}
}