dhorions / boxable Goto Github PK
View Code? Open in Web Editor NEWBoxable 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
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
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
}
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.
It doesn't display properly top border on the rows that will be drawn on the next page.
Example
bigTableWithoutHeaderRows.pdf
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?
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
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
Please update PDFBox version in pom.xml to 1.8.10. Consider also changing the README.md to tell not to use a 2.0 version to avoid problems as described in issue #11.
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!
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
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
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.
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,
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
I think this feature would be really nice to have in future
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!
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?
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?
I was not able to find out if we can add an image to the PDF using the Boxable.
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?
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?
It looks like the 1.2 version of Boxable does not yet have the Cell and Row classes that the TableTest relies on. Maybe publish the latest source as 1.2 or 1.2-SNAPSHOT ? Or perhaps up the version to 1.3?
Just a thought.
Thanks for the great software
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!
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
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)
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
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.
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; }
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)
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
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
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?
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?
Hey,
I want to congratulate you on a very impressive library.
Is there any possibility to add:
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 :
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();
}
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:
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.
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 :
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 :
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 :)
So mvn package
gives me this
It's just some javadoc but this also needs to be fixed.
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.
Is there any repo to add boxable as a dependency ?
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?
/*
* 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);
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?
Sometimes cell displays the text lines not in the order how we are parsing them due using HashMap in Paragraph
class
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.
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.
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!
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
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
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);
[...]
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.