Text Style Size & Alignment Tutorial
In this tutorial you'll learn how to use different text attributes for your reports.
    Nerval Reports has a small subset of predefined colors at the ReportColors class. Obviously, it probably won't have all the desired colors one should expect to use at their reports. To fulfill that, you can declare new colors inside document's head via a call to addColor function. There's no limit of how many colors declarations you can do, but each created color object is only valid (and safe) inside the report it was declared.

reportGenerator.beginDocumentHead();
lilac = reportGenerator.addColor(200, 162, 200, "lilac");
celestialBlue = reportGenerator.addColor(73, 151, 208, "celestialBlue");
reportGenerator.endDocumentHead();
         
    At the head we can also define the font that should be used (note that it's a hint, because not all ReportGenerators supports font changes). Let's hint to use a non serifed font (I prefer serifed fonts, but let's be different here).

reportGenerator.hintNonSerifFont();
         
    A report is implemented based on a state machine (those familiar with OpenGL will get it immediately). Each state change will affect all operations after its call. For example, if one changes the text color to another, this color will affect all texts added with addText calls (or similar) after that, until the color is changed again. The same applies to alignment, font size, bold and italic texts and everything that could be defined with a 'set*' call.
    You can change the text color with the function setTextColor. The color used can be either one predefined at ReportColors class, or any other declared at current document's head. The color that is defined before any setTextColor call is ReportColors.DEFAULT_TEXT_COLOR.

reportGenerator.beginDocumentBody();
reportGenerator.setTextColor(ReportColors.BLUE);
reportGenerator.addText("This is a blue sentence.");
reportGenerator.addLineBreak();
reportGenerator.endDocumentBody();
         
    It's possible to change text color inside the same textual line with multiple addText's combined with setTextColor calls:

reportGenerator.addText("I'm with the previous defined color, ");
reportGenerator.setTextColor(celestialBlue);
reportGenerator.addText("but I'm with the new celestial blue ");
reportGenerator.setTextColor(ReportColors.RED);
reportGenerator.addText("and red I could be.");
reportGenerator.addLineBreak();
         
    The use of font sizes is analogous to color's use. For multiple format support, the sizes are defined in terms of how big (or small) they are and should be one of those defined at ReportFontSize class. From smaller to bigger, they are: TINY, EXTRA_SMALL, SMALL, NORMAL, LARGE, EXTRA_LARGE, HUGE. You can change font size within the same text line.

reportGenerator.setTextColor(ReportColors.DEFAULT_TEXT_COLOR);
reportGenerator.addText("I'm the default (normal) text size, ");
reportGenerator.setFontSize(ReportFontSize.LARGE);
reportGenerator.addText("and I can grow ");
reportGenerator.setFontSize(ReportFontSize.SMALL);
reportGenerator.addText("or shrink ");
reportGenerator.setFontSize(ReportFontSize.EXTRA_SMALL);
reportGenerator.addText("at your ");
reportGenerator.setFontSize(ReportFontSize.TINY);
reportGenerator.addText("desire.");
reportGenerator.setFontSize(ReportFontSize.NORMAL);
reportGenerator.addLineBreak();
         
    For bold and italic changes, the same applies. Bold and italic are defined as 'on/off' states, and should be defined, respectively, with setBold and setItalic calls.

reportGenerator.addText("We can ");
reportGenerator.setBold(true);
reportGenerator.addText("bold some text ");
reportGenerator.setBold(false);
reportGenerator.setItalic(true);
reportGenerator.addText("italic some other ");
reportGenerator.setBold(true);
reportGenerator.addText("and bold italic the rest.");
reportGenerator.addLineBreak();
reportGenerator.setItalic(false);
         
    For text alignment we have some differences. Although on some ReportGenerators it could work without that, it's a good practice to always define groups of aligned text, with the group block of PARAGRAPH type. For example, to center align some text:

reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);
reportGenerator.beginGroup(ReportGroupType.PARAGRAPH);
reportGenerator.addText("I'm a centered bold text in a centered paragraph aligned group");
reportGenerator.endGroup();
reportGenerator.setBold(false);
         
    As you can see at the generated file, the paragraph group always add a line break to its end. If you desire to use different alignments at the same line, you should use the INLINE group type. But beware, because it's very easy to overlap INLINE group texts with another INLINE group.

reportGenerator.setTextAlignment(ReportTextAlignment.LEFT);
reportGenerator.beginGroup(ReportGroupType.INLINE);
reportGenerator.addText("I'm at the left line side");
reportGenerator.endGroup();

reportGenerator.setTextAlignment(ReportTextAlignment.RIGHT);
reportGenerator.beginGroup(ReportGroupType.INLINE);
reportGenerator.addText("and I'm at the right at the same line.");
reportGenerator.endGroup();
reportGenerator.addLineBreak();
         
    Almost everything learned here are also valid inside tables, the only exception being INLINE groups inside cells which won't work (you can get similar results using multiple cells each one with a distinct alignment). Let's create a table with some color, style size and alignment changes inside its elements. One thing is important to note here: if you desire to set an alignment to the whole cell, you can define it before the beginTableElement, without the need of a group definition, as it can act as a group itself.

reportGenerator.setTableBorderStyle(1.0f, ReportColors.BLACK);
reportGenerator.beginTable(3);

reportGenerator.setTextColor(ReportColors.WHITE);
reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);

/* A larger table header */
reportGenerator.beginTableHeaderRow();
reportGenerator.setFontSize(ReportFontSize.LARGE);
reportGenerator.setBold(true);
reportGenerator.addTableHeaderCell("A header BIG line", 3);
reportGenerator.endTableHeaderRow();

/* A normal, but centered and white, column titles */
reportGenerator.beginTableHeaderRow();
reportGenerator.setFontSize(ReportFontSize.NORMAL);
reportGenerator.addTableHeaderCell("Column A");
reportGenerator.addTableHeaderCell("Column B");
reportGenerator.addTableHeaderCell("Column C");
reportGenerator.endTableHeaderRow();

/* Reset color and bold */
reportGenerator.setBold(false);
reportGenerator.setTextColor(ReportColors.DEFAULT_TEXT_COLOR);

/* Let's define a row with three different aligned cells. */
reportGenerator.beginTableRow();

reportGenerator.setTextAlignment(ReportTextAlignment.LEFT);
reportGenerator.addTableCell("I'm at left");

reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);
reportGenerator.addTableCell("I'm a centered cell");

reportGenerator.setTextAlignment(ReportTextAlignment.RIGHT);
reportGenerator.addTableCell("I'm at right");

reportGenerator.endTableRow();

reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);
reportGenerator.beginTableRow();

/* Add a cell with multicolored text cell with one word italic. */
reportGenerator.beginTableCell();
reportGenerator.addText("A ");
reportGenerator.setTextColor(lilac);
reportGenerator.setItalic(true);
reportGenerator.addText("multicolored ");
reportGenerator.setItalic(false);
reportGenerator.setTextColor(celestialBlue);
reportGenerator.addText("text ");
reportGenerator.setTextColor(ReportColors.ORANGE);
reportGenerator.addText("cell.");
reportGenerator.endTableCell();

/* A cell with multiple font sizes. */
reportGenerator.setTextColor(ReportColors.DEFAULT_TEXT_COLOR);
reportGenerator.beginTableCell();
reportGenerator.setFontSize(ReportFontSize.EXTRA_LARGE);
reportGenerator.setBold(true);
reportGenerator.addText("Shout ");
reportGenerator.setBold(false);
reportGenerator.setFontSize(ReportFontSize.NORMAL);
reportGenerator.addText("and ");
reportGenerator.setFontSize(ReportFontSize.SMALL);
reportGenerator.addText("whisper ");
reportGenerator.setFontSize(ReportFontSize.EXTRA_SMALL);
reportGenerator.addText("lower ");
reportGenerator.setFontSize(ReportFontSize.TINY);
reportGenerator.addText("and lower.");
reportGenerator.endTableCell();

/* A right aligned cell with small text */
reportGenerator.setFontSize(ReportFontSize.SMALL);
reportGenerator.setTextAlignment(ReportTextAlignment.RIGHT);
reportGenerator.addTableCell("I'm a fully right-aligned cell, directly created with a addTableElement call avoiding the verbose begin-end block.");

reportGenerator.endTableRow();

reportGenerator.beginTableRow();

/* A cell with more than one paragraph, each one with distinct alignment. */
reportGenerator.beginTableCell();
/* (note that we are small) */
reportGenerator.setTextAlignment(ReportTextAlignment.RIGHT);
reportGenerator.setBold(true);
reportGenerator.beginGroup(ReportGroupType.PARAGRAPH);
reportGenerator.addText("April's 1st ");
reportGenerator.endGroup();
reportGenerator.setBold(false);

reportGenerator.setFontSize(ReportFontSize.NORMAL);
reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);
reportGenerator.beginGroup(ReportGroupType.PARAGRAPH);
reportGenerator.addText("This is the day some of us are fooled by 'expert' people.");
reportGenerator.endGroup();
reportGenerator.endTableCell();

/* A double cell */
reportGenerator.beginTableCell(2, 1);
reportGenerator.setTextAlignment(ReportTextAlignment.CENTER);
reportGenerator.beginGroup(ReportGroupType.PARAGRAPH);
reportGenerator.addText("Sunday, 01/01/1984");
reportGenerator.endGroup();

reportGenerator.setTextAlignment(ReportTextAlignment.RIGHT);
reportGenerator.beginGroup(ReportGroupType.PARAGRAPH);
reportGenerator.addText("The first day of 1984 year.");
reportGenerator.endGroup();
reportGenerator.endTableCell();

reportGenerator.endTableRow();


reportGenerator.endTable();

reportGenerator.endDocumentBody();
         

Here's the pdf generated by NervalReports' PDFReportGenerator:

And here you can download the full code of this tutorial.