package org.freehep.graphicsio.pdf.test;

import java.awt.Rectangle;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.io.*;
import java.util.Calendar;

import org.freehep.graphicsio.font.FontEmbedder;
import org.freehep.graphicsio.font.encoding.CharTable;
import org.freehep.graphicsio.font.encoding.Lookup;
import org.freehep.graphicsio.pdf.PDFFontEmbedderType1;
import org.freehep.graphicsio.pdf.PDFFontEmbedderType3;
import org.freehep.graphicsio.pdf.PDFWriter;
import org.freehep.graphicsio.pdf.PDFDocInfo;
import org.freehep.graphicsio.pdf.PDFCatalog;
import org.freehep.graphicsio.pdf.PDFViewerPreferences;
import org.freehep.graphicsio.pdf.PDFDictionary;
import org.freehep.graphicsio.pdf.PDFPageTree;
import org.freehep.graphicsio.pdf.PDFPage;
import org.freehep.graphicsio.pdf.PDFStream;
import org.freehep.graphicsio.pdf.PDFRedundanceTracker;

public class TestPDFFontEmbedding {

    public static void main(String[] argv) {

	try {

	    PDFWriter pdf = new PDFWriter(new FileOutputStream("fonttest.pdf"));
	    pdf.comment("file generated by TestFontEmbedding, Freehep lib");

	    // info
	    PDFDocInfo info = pdf.openDocInfo("DocInfo");
	    info.setTitle("Font Embedding Test");
	    info.setAuthor("Simon Fischer");
	    info.setSubject("Test File of the Font Embedding of the FreeHEP library");
	    info.setKeywords("PDFWriter; FreeHEP");
	    info.setCreator(TestPDFFontEmbedding.class.getName());
	    info.setCreationDate(Calendar.getInstance());
	    pdf.close(info);

	    // catalog
	    PDFCatalog catalog = pdf.openCatalog("Catalog", "RootPage");
	    catalog.setPageMode("UseOutlines");
	    catalog.setViewerPreferences("Preferences");
	    catalog.setOpenAction(new Object[] { pdf.ref("FontPage"), pdf.name("Fit")});
	    pdf.close(catalog);

	    // preferences
	    PDFViewerPreferences prefs = pdf.openViewerPreferences("Preferences");
	    prefs.setFitWindow(true);
	    prefs.setCenterWindow(false);
	    pdf.close(prefs);

	    // pages
	    PDFPageTree pages = pdf.openPageTree("RootPage", null);
	    pages.addPage("FontPage");
	    pages.setMediaBox(0, 0, 612, 792);
	    pages.setResources("Resources");
	    pdf.close(pages);

	    // page
	    PDFPage fontPage = pdf.openPage("FontPage", "RootPage");
	    fontPage.setContents("FontPageContent");
	    pdf.close(fontPage);

	    // first page content
	    PDFStream pageStream = pdf.openStream("FontPageContent",
						  new String[] { "Flate", "ASCIIHex" });

	    pageStream.move(100,100);
	    pageStream.line(200,200);
	    pageStream.stroke();

	    pageStream.beginText();
	    pageStream.font(pdf.name("F1"), 12);
	    pageStream.text(100, 200);
	    pageStream.show("ABC abc!");
	    pageStream.endText();

	    CharTable table = Lookup.getInstance().getTable("PDFLatin");
	    String str = "";
	    double y = 500;
	    for (int i=1; i<256; i++) {
		String name = table.toName(i);
		if (name != null)
		    str += table.toUnicode(name);
		else
		    str += "#";
		if ((str.length() % 32 == 31) || (i == 255)) {
		    pageStream.beginText();
		    pageStream.font(pdf.name("F1"), 12);
		    pageStream.text(100, y);
		    pageStream.show(str);
		    pageStream.endText();
		    System.out.println(str);
		    str = "";
		    y -= 20;
		}
	    }

	    pdf.close(pageStream);


	    // resources
	    PDFDictionary resources = pdf.openDictionary("Resources");
	    resources.entry("ProcSet", pdf.ref("OurPageProcSet"));
	    PDFDictionary fontList = resources.openDictionary("Font");
	    fontList.entry("F1", pdf.ref("MyFont"));
	    resources.close(fontList);
	    pdf.close(resources);

	    pdf.object("OurPageProcSet", new Object[] { pdf.name("PDF") });

	    PDFRedundanceTracker tracker = new PDFRedundanceTracker(pdf);

	    // font embedding
	    switch (3) {
	    case 1:
		PDFDictionary fontDict = pdf.openDictionary("MyFont");
		fontDict.entry("Type", pdf.name("Font"));
		fontDict.entry("Subtype", pdf.name("Type1"));
		fontDict.entry("Name", pdf.name("F1"));
		fontDict.entry("BaseFont", pdf.name("Helvetica"));
		pdf.close(fontDict);
		break;

	    case 2:
		Font font = new Font("Monotype Corsiva", Font.PLAIN, 1000);
		FontRenderContext context = new FontRenderContext(null, true, true);
		FontEmbedder fe = new PDFFontEmbedderType3(context, pdf, "MyFont", tracker);
		fe.includeFont(font, Lookup.getInstance().getTable("PDFLatin"), "F1");
		break;

	    case 3:
		font = new Font("Impact", Font.PLAIN, 1000);
		context = new FontRenderContext(null, true, true);
		fe = PDFFontEmbedderType1.create(context, pdf, "MyFont", tracker);
		fe.includeFont(font, Lookup.getInstance().getTable("PDFLatin"), "F1");
		break;
	    }

	    tracker.writeAll();

	    pdf.close();
	    System.exit(0);
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
}
