import java.awt.Color;
import java.io.*;

import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

class MyTableEvent implements PdfPTableEvent {

	private int value;
	public MyTableEvent(int v) { value = v; }

    public void tableLayout(PdfPTable table, float[][] width, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
		/* from "table_event.java" */
        float baseW = width[0][0];
        float baseH = heights[0];
        PdfContentByte cb = canvases[PdfPTable.TEXTCANVAS];
        cb.saveState();
        cb.setColorStroke(Color.black);
        cb.setColorFill(Color.black);
        float baseX = baseW+30;
        float baseY = baseH-145;
        try {
			/* Draw axis */
			float axisThickness=1f;
			float begX = baseX - axisThickness/2;
			float deltaX = 3*18*8;
			float endX = begX + deltaX + axisThickness;
			cb.setLineWidth(axisThickness);
			cb.moveTo(begX, baseY);
			cb.lineTo(endX, baseY);
			cb.moveTo(baseX, baseY);
			cb.lineTo(baseX, baseY+132);
			cb.setLineWidth(0.5f);
			for (int k = 1; k <= 9; ++k) {
				float baseMarkY = baseY + k*14;
				cb.moveTo(baseX-1.5f, baseMarkY);
				cb.lineTo(baseX+1.5f, baseMarkY);
			}

			/* If value is even, draw table-dependant data BEFORE putting label on axis */
			if (value % 2 == 0) {
				float posX = begX + value; float posY = baseY + value;
				cb.circle(posX, posY, 5); cb.stroke();
			}

			/* Draw values on Y-axis */
			/* Inspired from "align2.java" */
			BaseFont bf = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.WINANSI, false);
			cb.beginText();
			cb.setFontAndSize(bf, 10f);
			for (int i = 1; i <= 9; ++i) {
				float posCaptionY = baseY + i*14 - 3.55f;
				cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, ""+i, baseX-8, posCaptionY, 0);
			}
			cb.endText();

			/* If value is odd, draw table-dependant data AFTER putting label on axis */
			if (value % 2 != 0) {
				float posX = begX + value; float posY = baseY + value;
				cb.circle(posX, posY, 5); cb.stroke();
			}

		}
		catch (Exception e) {
			System.err.println(e.getMessage());
		}
        cb.restoreState();
    }
}

public class problem {

    public static void main(String[] args) {

		int valueForTable1 = 12;
		int valueForTable2 = 33;

        Document document = new Document(PageSize.A4, 50, 50, 50, 50);
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:\\problem.pdf"));
            document.open();

            String cuRTxt;
            Font titre_font = new Font(Font.TIMES_ROMAN, 18, Font.BOLD);
            Font titre1_font = new Font(Font.TIMES_ROMAN, 14, Font.BOLD);
            Font normal_font = new Font(Font.TIMES_ROMAN, 11);
            Font normal_font_bold = new Font(Font.TIMES_ROMAN, 11, Font.BOLD);
            Font table_font = new Font(Font.TIMES_ROMAN, 11);
            Font table_bold_font = new Font(Font.TIMES_ROMAN, 11, Font.BOLD);
            Font legende_font = new Font(Font.TIMES_ROMAN, 10);

            PdfContentByte cb = writer.getDirectContent();
            cb.setLineWidth(0.3f);
            cb.setColorStroke(Color.black);

            cuRTxt = "SOME TITLE";
            Phrase titre_phr = new Phrase(cuRTxt, titre_font);
            Paragraph titre_par = new Paragraph(titre_phr);
            titre_par.setAlignment(Element.ALIGN_CENTER);
            titre_par.setSpacingAfter(10);
            document.add(titre_par);

            cuRTxt = "Intro";
            Phrase titre1_intr_phr = new Phrase(cuRTxt, titre1_font);
            Paragraph titre1_intr_par = new Paragraph(titre1_intr_phr);
            titre1_intr_par.setAlignment(Element.ALIGN_LEFT);
            document.add(titre1_intr_par);

            cuRTxt = "This is some preliminary text.";
            cuRTxt += "\nIt is followed by a graphic with parameterized content.";
            cuRTxt += "\nHere, it is " + valueForTable1 + ".";
            Phrase normal_intr_phr = new Phrase(cuRTxt, normal_font);
            Paragraph normal_intr_par = new Paragraph(normal_intr_phr);
            normal_intr_par.setAlignment(Element.ALIGN_JUSTIFIED);
            normal_intr_par.setLeading(14);
            normal_intr_par.setSpacingAfter(10);
            document.add(normal_intr_par);

            /* Simply to have a frame for the graphic */
            PdfPTable myTable1 = new PdfPTable(1);
            MyTableEvent myTabEv1 = new MyTableEvent(valueForTable1);
            myTable1.setTableEvent(myTabEv1);
            myTable1.setSpacingBefore(10);
            myTable1.getDefaultCell().setFixedHeight(165);
            myTable1.setWidthPercentage(100);
            myTable1.addCell(new Phrase(""));
            document.add(myTable1);

            cuRTxt = "Section 1";
            Phrase titre1_meth_phr = new Phrase(cuRTxt, titre1_font);
            Paragraph titre1_meth_par = new Paragraph(titre1_meth_phr);
            titre1_meth_par.setAlignment(Element.ALIGN_LEFT);
            document.add(titre1_meth_par);

            cuRTxt = "Now, we have another graphic with parameter " + valueForTable2 + ".";
            Paragraph normal_meth_par = new Paragraph(new Phrase(cuRTxt, normal_font));
            normal_meth_par.setAlignment(Element.ALIGN_JUSTIFIED);
            normal_meth_par.setLeading(14);
            document.add(normal_meth_par);

            PdfPTable myTable2 = new PdfPTable(1);
            MyTableEvent myTabEv2 = new MyTableEvent(valueForTable2);
            myTable2.setTableEvent(myTabEv2);
            myTable2.setSpacingBefore(10);
            myTable2.getDefaultCell().setFixedHeight(165);
            myTable2.setWidthPercentage(100);
            myTable2.addCell(new Phrase(""));
            document.add(myTable2);

            document.close();
            System.out.println("Finished.");
        }
        catch (Exception de) {
            de.printStackTrace();
        }
    }
}
