GithubHelp home page GithubHelp logo

dhorions / boxable Goto Github PK

View Code? Open in Web Editor NEW
332.0 24.0 153.0 7.33 MB

Boxable is a library that can be used to easily create tables in pdf documents.

Home Page: http://dhorions.github.io/boxable/

License: Apache License 2.0

Java 100.00%
java pdf-document pdf pdfbox pdf-tables pdf-files

boxable's People

Contributors

aldaris avatar bryant1410 avatar cschemmy avatar dependabot[bot] avatar dev-comrade avatar dgautier avatar dhorions avatar dobluth avatar frulenzo avatar giboow avatar gitter-badger avatar johnmanko avatar nstdspace avatar rachidlelaborantin avatar reiz avatar schmitzhermes avatar slampisko avatar sundbp avatar sz-liva avatar theeogflip avatar vobarian avatar zaqpiotr avatar zeerdonker avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

boxable's Issues

BaseTable - override not done properly

should be

@Override
    protected void loadFonts() throws IOException{
        // Do nothing as we don't have any fonts to load
    }

instead of

@Override
    protected void loadFonts() {
        // Do nothing as we don't have any fonts to load
    }

Rotate text in a cell

Hi!

I really love your work, it really makes our life easier to use PDFBox.
Is there any solution regarding to rotate a String in cell ex. 90 degree?

Thanks in advanced.

adding line break inside a column, question about fonts and multiple rows within a cell

Given a cell, like follows: cell = row.createCell(20, "Email: " + bean.getEmail()), how can I put a line break between Email and the variable bean.getEmail()?

I know, for example, that to make the Email word bold, I could do: row.createCell(20, "<b>Email:<b> " + bean.getEmail()) but I haven't been able to figure out how to make a line break.

Also, do I have other font options besides the one available in the class PDType1Font?

In the attached image I present an example of what I am trying to do when it comes to having multiple rows within a cell. Please see what the red arrows is pointing to. Can I accomplish that using Boxable?

multiple_rows_within_cell

Allowing page break within cell(s)

I am creating a PDF with a long list of legal content, I am using a table with two columns to populate the content. The content starts at about half of the first page and it keeps going toward the second page. However, because it had to go to the second page, the system is moving the entire table to the second page causing a big amount of blank space on the first page. How can I prevent this and allow that the table stays on the first page but the content keeps going on the next page?

As an example, look at the attached pdf. Look at the table on the second page. I would like for it to start on the first page and keep going to the following page to prevent the blank space.
1250000.pdf

Default font

It would be good to reconsider using current font Helvetica as default font. As we already know, it has many problems with special characters ( e.g [ ] * ♥ & ¤ ¢ £ $ ¥ € § ¨ © ∞ ª ¬ ® ™ ¯ ° ± ´ µ ¶ … · ¸ º ÷ † ß ⁰¹²³⁴⁵⁶⁷⁸⁹ ₀₁₂₃₄₅₆₇₈₉ ½ ¼ ¾ ↑ ↗ ↓ → ← Ā ā Ā́ ā́ Ā̀ ā̀ Ā̂ ā̂ Ā͂ ā͂ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ḇ ḇ C̄ c̄ Ḏ ḏ Ē ē Ḗ ḗ Ḕ ḕ Ē̂ ē̂ Ē͂ ē͂ Ḡ ḡ H̱ ẖ Ī ī Ī́ ī́ Ī̀ ī̀ Ī̂ ī̂ Ī͂ ī͂ Ḵ ḵ Ḻ ḻ Ḹ ḹ M̄ m̄ Ṉ ṉ N̄ n̄ Ō ō Ṓ ṓ Ṑ ṑ Ō̂ ō̂ Ō͂ ō͂ Ȫ ȫ Ǭ ǭ Ȭ ȭ Ȱ ȱ R̄ r̄ Ṟ ṟ Ṝ ṝ T̄ t̄ Ṯ ṯ Ū ū Ū́ ū́ Ū̀ ū̀ Ū̂ ū̂ Ū͂ ū͂ Ǖ ǖ Ṻ ṻ V̄ v̄ W̄ w̄ X̄ x̄ Ȳ ȳ Ȳ́ ȳ́ Ȳ̀ ȳ̀ Ȳ̂ ȳ̂ Ȳ͂ ȳ͂ Ẕ ẕ etc.).

It would be good to use some of these fonts ftp://ftp.gwdg.de/pub/gnu/www/savannah-checkouts/non-gnu/freefont/index.html (doesn't let me to link it as url, sorry!) . I lean towards Sans.
This is not high priority but I think, it is worth considering.

Full credit for this link goes to @dobluth

A lot of warning message when draw a table

Hi
this is a great tools to generate a table using pdfbox.
but i found a lot of message on the background log.
such as:

Apr 29, 2016 1:54:45 PM org.apache.pdfbox.contentstream.operator.graphics.ClosePath process
WARNING: ClosePath without initial MoveTo

my configuration incorrect? how to remove ? thanks!

Infinite recursion when yStartNewPage is too small

This is mostly user error, if yStartNewPage is small enough that the row being added to a new page ends up causing isEndOfPage() to be true when adding the header you end up with an infinite recursion at line 184 of Table.java

Who wants to work on documenting this library

Hi everyone,

a lot of helpful people have been adding great features to this library. I think there are now so many great features, that we should start thinking about properly documenting them and providing easy examples to people can get started using the library quickly.

Does anyone want to help with this?

Thanks,

Dries

Unable to draw the '<' character in a cell.

I am currently attempting to draw the '<' character within a cell but it appears to be blank. I think it may have issues since this is also the beginning of a HTML tag, so maybe it removes it?

For now, I can only take a screenshots of the code/issue. When I have time later today, I plan on creating a new project/sample code to test this out specifically.
screen shot 2016-09-11 at 6 33 06 am

screen shot 2016-09-11 at 6 11 57 am

Useless extra space added in PdfTable and a few comments

Hi,

the following line in PdfTable causes text in new columns to be shifted by an incremental extra space:

nextx += cell.getWidth() + HorizontalCellMargin;

I have therefore replaced it by this line, in my code:

nextx += cell.getWidth();

The 'bookmark' variable is not used anywere in PdfTable. I have commented it out:
//bookmark = true;

The 'lines' List is not used in the code. I've commented it out:

// List lines = cell.getParagraph().getLines();

I've added the following lines, respectively:

contentStream.setNonStrokingColor( Color.BLACK);
-> contentStream.setLineWidth(HorizontalCellMargin);

contentStream.setNonStrokingColor(Color.BLACK);
-> contentStream.setLineWidth(VerticalCellMargin);

Please let me know what you think.

Cheers,

Incorrect cell text left align

Class: Table
Function: private void drawCellContent(Row row) throws IOException {

Code part:
while (cellIterator.hasNext()) {
.....
nextX += cell.getWidth() + HorizontalCellMargin;
}

Remove: + HorizontalCellMargin;

In other case your cell text items will be moved right in case you have a lot of columns

how to get table height dynamically

I am creating tables using PDFBOX Boxable library. The table height will depend on how much data there in a database. If I have two tables one after the other, I need to know the table height of the first one so that I can draw the next one just below it. How can I find the table height from the previous table?

Also, if there table (or some content inside the page) reaches to the end of the page, how can I tell the system to automatically create a second page?

Please let me know!

two headers

is there a way to define two headers
Horizontal and Vertical.

and general question, there are few nice enhancments on the Pull Request.
when they are going to be merged?

Automatically scale cell text

In my opinion it would be nice to automatically scale the cell text if its width is greater than cell width.

I have a cell that display the SHA256 of some data and for some hash the text width is greater than cell width.

I resolved with this code during the cell creation:

Cell<PDPage> cell2 = row.createCell(38f, getHash(), HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE);
        cell2.setFont(font);
        float cellWidth = cell2.getWidth();
        float textWidth = font.getStringWidth(getHash())/1000*cell2.getFontSize();
        while (cellWidth < textWidth) {
            cell2.setFontSize(cell2.getFontSize()-.5f);
            cellWidth = cell2.getWidth();
            textWidth = font.getStringWidth(getHash())/1000*cell2.getFontSize();
        }

Do you plan on adding this feature in the future?

Boaxable on Maven Central

Hi,

Due to some contraints we would like to use reposetoeries which are hostet on maven central...

is it possible (or planned) that you will maybe transsion from jitpack to maven in the near future?

ImageCell with text

At the moment it isn't possible to write text into an ImageCell, or at least I couldn't do it.
It would be nice to place a text above, under or directly onto a picture.

Do you plan on adding this feature in the future? / Would you consider adding this?

How to detect if a row is the last row that fits on a page?

Guys, please help me understand how pagination works in boxable(1.5-RC).

Scenario:

I'm generation a report which has two tables of the same structure but with different data set.
Second table should start from new page. To remove duplicated values from 1st column I
simulate merging(it is not yet implemented as I understood) by changing bottom border style and values.

The problem:
First cell in last row on page has no bottom border.

I tried to check if current row I'm filling at given loop iteration is the last on page. But I had no chance to
find how to check this. I've found that PageProvider has curentPageIndex property but when I checked
it in debug -- it's value is always -1 even when table already jumped on new page...

Can someone explain what is the correct way of handling pages?

Thanks beforehand!

Line spacing

Maybe it would be good feature to implement some line spacing as Microsoft Word, something like

Single --> This option accommodates the largest font in that line, plus a small amount of extra space. The amount of extra space varies depending on the font that is used.

1.5 lines --> This option is one-and-one-half times that of single line spacing.

Double --> This option is twice that of single line spacing.

Thanks Christian Schmidt for mentioning this 👍

Example for double spacing (test7 used)
double_spacing.pdf

font issue - getting exception

Hi,
I have this code:

    public void createRow(MrtPackageRoute routeEntryValue) 
    {
        Row<PDPage> headerRow = this.createRow(10f);
        Cell<PDPage> cell;

        //Loan Type
        cell = headerRow.createCell((100 / 3), CommonUtil.getLocalValue(routeEntryValue.getRefLocalByRouteLoanType2local()));
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);

        //Amount
        cell = headerRow.createCell((100 / 6), Double.valueOf(routeEntryValue.getRouteLoanAmount()).toString());
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);

        //Years
        cell = headerRow.createCell((100 / 12), Double.valueOf(routeEntryValue.getRoutePeriodYears()).toString());
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);

        //Interest Rate
        cell = headerRow.createCell((100 / 12), Double.valueOf(routeEntryValue.getNominalInterestRate()).toString());
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);

        //Monthly Payment
        cell = headerRow.createCell((100 / 6), Double.valueOf(routeEntryValue.getRouteFirstPayment()).toString());
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);

        cell = headerRow.createCell((100 / 6), CommonUtil.getLocalValue(routeEntryValue.getRefLocalByCalcMethod2local()));
        cell.setFont(PDType1Font.TIMES_ROMAN);
        cell.setFontSize(6);
    }
}

when code is coming to:
table.draw();

getting the below exception. assuming it is font issue.
I'm using Hebrew.
What need to be done in order to support it?

Exception
00:03:58,409 WARN [org.apache.pdfbox.pdmodel.font.PDType1Font](default task-2) Using fallback font ArialMT for base font ZapfDingbats
00:03:58,439 ERROR [stderr](default task-2) java.lang.IllegalArgumentException: U+05DE ('afii57678') is not available in this font's encoding: WinAnsiEncoding

00:03:58,439 ERROR [stderr](default task-2) at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:345)

00:03:58,439 ERROR [stderr](default task-2) at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:285)

00:03:58,440 ERROR [stderr](default task-2) at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:314)

Line breaks

Is there a way to add line breaks to text in cells?

I've tried things like this, but I keep getting an encoding error:
row = table.createRow(10f); cell = row.createCell(100, "test1\ntest2");

Note: In PDFBox, you write new line characters by calling PDPageContentStream.newLine().

Thanks,
Nicholas Castorina

Table to big starts new Page but how to handle it?

Hi,

I'm using your awesome boxable plugin, but i ran into a problem where i just don't know how to handle it properly.

I'm trying to add severall table on the same Page. Most of them have a fixed height due to their inputs but one table is dynamic (meaning the row count varies)

When I reach the end of the page the table (correctly) repeat its headers and contiunes to display more rows...

So back to the problem:

After the Table meantioned above there needs to be at least two more tables (if it fits) but if not how do i get the last position of the table?

if no PageBreak happend, i currently remeber all the BaseTables. Ask each of them their height. Add them together and set the yStart correctly.

If a PageBreak happen what should i do in this situation?
Also how do i get the "new Page"? Because currently if a PageBreak happens the logic i'm using tells the new Table defently to start at a new page. In result i have 2 half empty Pages.

Maybe someone had a similiar problem already and could help?

Thnaks in advance.

Edit:
I should add that after those tables i force a PageBreak (due to display logic) so from there i have no problems continuing.

getHeaderAndDataHeight gets incorrect data

This method only gets a value when a header is set. And when you get a value is only the height of the header and the first cell. It should get the height of all the cells, not just the first one.

public float getHeaderAndDataHeight() { return header == null ? 0 : header.getHeight() + rows.get(header == null ? 0 : 1).getHeight(); }

Proposed method

public float getHeaderAndDataHeight() { float height; for (Row<T> row : rows){ height += row.getHeight(); } return height; }

No linebreak in Cell.setText() possible

Cell.setText("Hello\nWorld")

Leads to

U+000A ('controlLF') is not available in this font's encoding: WinAnsiEncoding

java.lang.IllegalArgumentException: U+000A ('controlLF') is not available in this font's encoding: WinAnsiEncoding at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:344) at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:285) at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:314) at be.quodlibet.boxable.Paragraph.getLines(Paragraph.java:83) at be.quodlibet.boxable.Paragraph.getHeight(Paragraph.java:154) at be.quodlibet.boxable.Cell.getTextHeight(Cell.java:391) at be.quodlibet.boxable.Cell.getCellHeight(Cell.java:366) at be.quodlibet.boxable.Row.getHeight(Row.java:159) at be.quodlibet.boxable.Table.getMinimumHeight(Table.java:703) at be.quodlibet.boxable.Table.draw(Table.java:192)

Cell Constructor

Hi All,

I try to get familiar with boxable. I just want to create a BaseTable with two columns. Here is my code:

PDDocument doc = new PDDocument();

PDPage p1 = new PDPage(PDRectangle.A4);
doc.addPage(p1);

float yTableStart = PDRectangle.A4.getHeight() - 75;
float tableWidth = PDRectangle.A4.getWidth() - 150;
BaseTable table = new BaseTable(yTableStart, yTableStart, 75, tableWidth, 75, doc, p1, true, true);

Row<PDPage> hRow = table.createRow(20f);
hRow.createCell(tableWidth / 2, "Test1").setFont(PDType1Font.COURIER);
hRow.createCell(tableWidth / 2, "Test1").setFont(PDType1Font.COURIER);

table.addHeaderRow(hRow);

table.draw();

doc.save(new File("d:/tmp/table.pdf"));

As you can see in my code I am using the whole page width for my table (except a margin space). In the table above I like to arrange two cols/cells with the same width (tableWidth / 2).

When I execute the code, I get the following output:

Exception in thread "main" java.lang.IllegalArgumentException: Cell Width=991.3519 can't be bigger than row width=445.27563
    at be.quodlibet.boxable.Cell.<init>(Cell.java:103)
    at be.quodlibet.boxable.Cell.<init>(Cell.java:68)
    at be.quodlibet.boxable.Row.createCell(Row.java:47)
    at com.commerzbank.tryPdfBox.App4.main(App4.java:30)

After some debugging I found out, that the parameterized cell width is increased by the follwoing lines:

Cell(Row<T> row, float width, String text, boolean isCalculated, HorizontalAlignment align,
            VerticalAlignment valign) {
        this.row = row;
        if (isCalculated) {
            double calclulatedWidth = ((row.getWidth() * width) / 100);
            this.width = (float) calclulatedWidth;
        } else {

Why? What I am doing wrong?

Thanks,

Marius

Empty Cells fail to draw

Hello,

not sure if it is right here. I am using boxable 1.4 with PDFBox 2.0.2 and I can create a Table with that

public static BaseTable getTableFromListString(BaseTable tTable, List<String[]> cellText, PDFont font) {

    for (String[] vd : cellText) {
        Row<PDPage> row = tTable.createRow(HIGHT);
        Cell<PDPage> c = row.createCell(WIDTH1, vd[0]);
        c.setFont(font);
        c.setFillColor(Color.LIGHT_GRAY);
        c = row.createCell(WIDTH2, vd[1]);
        c = row.createCell(WIDTH3, vd[2]);
    }

    return tTable;
}

But than Bastable draw fails when e.g. cell three is an empty string. This is because it has no hight.
See Table.class

private boolean isEndOfPage(Row<T> row) {
    **float currentY = yStart - row.getHeight();**
    boolean isEndOfPage = currentY <= pageBottomMargin;
    if (isEndOfPage) {
        setTableIsBroken(true);
    }

    // If we are closer than bottom margin, consider this as
    // the end of the currentPage
    // If you add rows that are higher then bottom margin, this needs to be
    // checked
    // manually using getNextYPos
    return isEndOfPage;
}

I think this worked in older versions

Page Breaking with multiple Tables on the Same Page (Horizontal)

hi Guys,

i have encountered the following problem,

i try to have 2 tables side by side on one Page.

In the middle of the first page you see a section called "Bauteil Position 4 Typ : 415

if the left table is small enough everthing works as expected.

(see example2 )
Example 2.pdf

if on the other hand the table on the left (which is always bigger than the one on the right) breaks i'm not sure how to display the secound tale (right one) correctly..

what happens is that table left causes a page break and creates a new page. the right table which starts on the same page at the same hight also want to generate a page break... some how i have to tell the secound page to which page it should pagebreak if necessary.

(see example for the prolem)
Example.pdf

Does somebody have a clue how to fix this problem?

Discussion on plans for version 2.0

Hello,
I have nice experience using boxable. But sometimes people around are worrying about a bit ugly API.
Is there any plans to make in nicer and more usefull?

Or even if there is any roadmaps foe project? Some vision?

Footer

Hey,

I want to congratulate you on a very impressive library.

Is there any possibility to add:

  • a footer row
  • page numbers at footer (page 1 of 5, page 2 of 5, page 3 of 5...)

Incorrect nesting of list tags

Unfortunately when we have multiple list nesting it doesn't intend properly

Example
<ul><li>a</li><li>b</li><ul><li>b.1</li><li>b.2</li><ul></ul>

Gives this output :

  • a
  • b
  • b.1
  • b.2

Test case:

@Test
    public void IncorrectHTMLListNesting() throws IOException {

        //Set margins
        float margin = 10;

        //Initialize Document
        PDDocument doc = new PDDocument();
        PDPage page = addNewPage(doc);

        //Initialize table
        float tableWidth = page.getMediaBox().getWidth() - (2 * margin);
        float yStartNewPage = page.getMediaBox().getHeight() - (2 * margin);
        boolean drawContent = true;
        boolean drawLines = true;
        float yStart = yStartNewPage;
        float bottomMargin = 70;
        BaseTable table = new BaseTable(yStart, yStartNewPage, bottomMargin, tableWidth, margin, doc, page, drawLines,
                drawContent);

        //Create Header row
        Row<PDPage> row = table.createRow(15f);
        Cell<PDPage> cell = row.createCell((100 / 3f), "<ul><li>a</li><li>b</li><ul><li>b.1</li><li>b.2</li></ul></ul>", HorizontalAlignment.get("center"),
                VerticalAlignment.get("top"));
        table.draw();

        //Save the document
        File file = new File("target/ListNesting.pdf");
        System.out.println("Sample file saved at : " + file.getAbsolutePath());
        Files.createParentDirs(file);
        doc.save(file);
        doc.close();
    }

Tables row are not aligned when using external fonts

On Sample 1 I have added fonts:

` //fonts to be used by the doc

PDType0Font tnrFont;
PDType0Font tnrBoldFont;

//Initialize Document

    PDDocument doc = new PDDocument();
    File tnrFontFile = new File("c://temp//font//times.ttf");
    tnrFont = PDType0Font.load(doc, tnrFontFile);
    File tnrBoldFontFile = new File("c://temp//font//timesbd.ttf");
    tnrBoldFont = PDType0Font.load(doc, tnrBoldFontFile);

`
in the for loop used the new Fonts with size 14:

        //Add multiple rows with random facts about Belgium
        for (String[] fact : facts) {

            row = table.createRow(50f);
            cell = row.createCell((100 / 3f) * 2, fact[0]);
//          cell.setFont(PDType1Font.HELVETICA);
            cell.setFont(tnrFont);
            cell.setFontBold(tnrBoldFont);
            cell.setFontSize(14);

the output was this problematic pdf:
BoxableSample1_with_PDType0Font.pdf

there are few problems here:

  1. lines
  2. text is not going to the next row but there are two words on same location.

Setting cell width as ratio of page width

I'm having some trouble figuring out how to set cell widths so that they fit snug in the table.

I'm creating the table by setting the width as I've seen in the examples:
float margin=10; float tableWidth=page.getMediaBox().getWidth() - (2 * margin);

I then create cells by setting their widths as a fraction of the tableWidth. I will have 13 cells, the first of which has to be 3 times wider than all the rest, so I am setting:

Cell<PDPage> cell = row.createCell(3*tableWidth/15f, value);

This gives me an error, saying

Cell Width=700.92804 can't be bigger than row width=592.0

My page's width is 612, so the tableWidth gets calculated correctly. Not sure why it thinks I'm trying to create massive cells though.

Please review - Add tables to pdf from csv

Hi,

this weekend I spent some time on creating a feature that I think would make this library a lot more helpful and easier to use.

I added the ability to load data from a csv-file and add that to a table in a pdf format.
The changes are in this branch.

In it's most basic form, it can be used like this :

BaseTable dataTable = new BaseTable(yStart, yStartNewPage, bottomMargin, tableWidth, margin, doc, page, true,true);
CSVTable t = new CSVTable(dataTable, page);
t.addCsvToTable(data, CSVTable.HASHEADER, ';');
dataTable.draw();

The output of that will look like this :
image

CSVexampleLandscape.pdf

But, there is also the ability to add other content to the table, and to apply a different format to the header row, first column, last colum, odd rows and even rows.

BaseTable dataTable = new BaseTable(yStart, yStartNewPage, bottomMargin, tableWidth, margin, doc, page, true, true);
//Add a few things to the table that's not coming from the csv file
Row h1 = dataTable.createRow(0f);
Cell c1 = h1.createCell(100, "Electricity Prices by type of user");
c1.setFillColor(new Color(144, 195, 212));
dataTable.addHeaderRow(h1);
Row h2 = dataTable.createRow(0f);
Cell c2 = h2.createCell(100, "Eur per kWh for Medium Size Households.<br/>Source <i>http://ec.europa.eu/eurostat/tgm/table.do?tab=table&init=1&plugin=1&language=en&pcode=ten00117</i>");
c2.setFillColor(new Color(175, 212, 224));
dataTable.addHeaderRow(h2);
CSVTable t = new CSVTable(dataTable, page);
//set the style template for header cells
t.getHeaderCellTemplate().setFillColor(new Color(13, 164, 214));
//set the style template for first column
t.getFirstColumnCellTemplate().setFillColor(new Color(13, 164, 214));
//set the style template for last column
t.getLastColumnCellTemplate().setFillColor(new Color(144, 195, 212));
//set the style template for normal, data columns
t.getDataCellTemplateEven().setFillColor(Color.WHITE);
t.getDataCellTemplateOdd().setFillColor(new Color(250, 242, 242));
t.addCsvToTable(data, CSVTable.HASHEADER,';');
 dataTable.draw();

The output of that will look like this :
image

CSVexampleAdvanced.pdf

I'm looking forward to any feedback on the usage, any issues found testing, and any advice on default colors. I'm really bad at combining colors :)

Support page clipping

I have a designated area for a table, but I'm not in full control of the amount of data going into that space. I'd like to set a clip rect on the page, so that if there's a bit more data than fits into the area, it will be clipped rather than overflowing the designated space.

I believe I need to set the clip rect in the content stream that the table is being rendered into (e.g. stream.addRect + stream.clip). If that's correct, then either boxable needs to provide an option to give it a clip rect, or (I think) the method to create the stream needs to be not private so I can override it and set the clip rect when the stream is created.

For the same reason, I would like to be able to force it to never create a new page. In my case that's not really a danger (the table area is high on the page and there's never THAT much too much data), but if I could I'd set the flag anyway to be sure.

repo

Is there any repo to add boxable as a dependency ?

table is not recognizing that it should be added to a new page

I have the attached code and the attached PDF (In case you can't open PDF, I am also attaching three JPGs). The relevant piece of code is also below. Notice what the problem is: table5 should be added to the next page but it is been added to the first one even though I am using table.getCurrentPage() What am I missing here?

PDFService.txt
samplePdf.pdf
page1
page2
page3

         /*
             * checking to see if the table went to the other page
             */
            if (table.getCurrentPage() != page) {
                contentStream.close();

                page = table.getCurrentPage();

                contentStream = new PDPageContentStream(document, page, true,
                        true, true);
            }

            // creating fourth table Declaraciones y Autorizaciones

            BaseTable table5 = new BaseTable(table4y, 750, bottomMargin,
                    tableWidth, margin, document, page, true, drawContent);

            // Create Header row
            row = table5.createRow(12f);
            cell = row.createCell(100, "Declaraciones y Autorizaciones",
                    HorizontalAlignment.CENTER, VerticalAlignment.MIDDLE);
            cell.setFont(PDType1Font.HELVETICA_BOLD);
            cell.setFillColor(new Color(26, 82, 118));
            cell.setTextColor(Color.WHITE);

            table5.addHeaderRow(row);

Cell.copyCellStyle(Cell) does only copy some part of the style

The current implementation copies the border style for all borders from the top border of the source cell but preserves the left border if it was null.

Also it doesn't copy the font size but the font type and color.

I think that's not intuitive. Why not copy all the border styles seperately. Why not copy the font size?
The name of the Method suggests that it copies the style of the cell, so it should actually do this.

I wonder why this is. Is this some sort of historical behavior?

Cell content displayed wrong

Sometimes cell displays the text lines not in the order how we are parsing them due using HashMap in Paragraph class

Drawing text other than tables

It is possible to get a reference to the PDPageContentStream that boxable uses so that I can write other text to the PDF (besides tables) and call moveTextPositionByAmount() to move around the page? I made a getter method to retrieve tableContentStream from within BaseTable and tried calling moveTextPositionByAmount() on that, but it does not seem to work.

Braking long words

If you have really long word (e.g. 30 characters) and that word has width bigger than cell width, second part of this word should be forced to appear in next cell.

I will take a look into this if there would be no volunteers.

special character cause failure in the sample test.

on sample1
getFacts()
facts.add(new String[]{"Tintin was conceived by Belgian artist Hergֳ©", "art", "celebrities", "inventions"});

there is special character here - Hergֳ©
this cause me the execution to fail:
java.lang.IllegalArgumentException: U+05B3 ('afii57802') is not available in this font's encoding: WinAnsiEncoding

once removed, all goes fine.

comment: appriciate what you have done, its realy great!

paging on table overflow broken

Hi,

i just realized that if a table is larger then the current page, the code does not result in correctly creating a new page.

i fixed this issue locally for me. It's because the createPage() method in BaseTable (boxable/src/main/java/be/quodlibet/boxable/BaseTable.java) is missing a document.add(page)

@Override
protected PDPage createPage() {
    PDPage page = new PDPage();
    this.getDocument().addPage(page);
    return page;
}

this did the trick for me.

cheers tunichgood

Issue with pdfbox v. 2.0.0-SNAPSHOT

Hi dhorions,

the folloving code:
BaseTable table = new BaseTable(yStart,yStartNewPage, bottomMargin, tableWidth, margin, document, page1, true, drawContent);

produces an error:
Severe: java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/edit/PDPageContentStream

It seems that current version is not working with the latest version of pdfbox, or am I missing something? Do you have any plans for updating your plugin?

Here is also a part from my pom.xml:

org.apache.pdfbox
pdfbox
2.0.0-SNAPSHOT


com.github.dhorions
boxable
1.2

Thank you for any help and best regards,
Andrej

Cell and big content

Unfortunately when cell has big content (bigger height than next page size), cell isn't properly formated through multiple pages.

Example
cellWithBigContent.pdf

[...]
Cell<PDPage> cell6 = row2.createCell((100 / 3f),
                "<p>Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. Nam tincidunt viverra posuere. Vivamus dui mi, rutrum non lectus vitae, scelerisque accumsan metus. Nunc auctor pulvinar magna at venenatis. Vivamus laoreet arcu risus, sed viverra nisl posuere sit amet. Donec sollicitudin pretium justo quis sodales. Vestibulum non tristique diam, in semper velit. Curabitur sapien nunc, vestibulum ut rhoncus ac, dictum a turpis. Nullam eu mollis sapien. Cras placerat massa ac ante porta, et molestie lectus vehicula. Duis sed imperdiet augue, at dictum arcu. Pellentesque ac maximus neque. Suspendisse bibendum suscipit nisl, at malesuada velit dapibus a. Phasellus tincidunt aliquam dui, vitae lacinia mi tristique sed. Proin euismod eleifend lacus, id volutpat quam suscipit euismod. ",
                HorizontalAlignment.get("center"), VerticalAlignment.get("bottom"));
        cell6.setFontSize(6);
[...]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.