use of com.lowagie.text.Element in project OpenPDF by LibrePDF.
the class VerticalPositionMark method getChunks.
/**
* @see com.lowagie.text.Element#getChunks()
*/
public ArrayList<Element> getChunks() {
ArrayList<Element> list = new ArrayList<>();
list.add(new Chunk(this, true));
return list;
}
use of com.lowagie.text.Element in project OpenPDF by LibrePDF.
the class ColumnText method goComposite.
protected int goComposite(boolean simulate) throws DocumentException {
if (!rectangularMode)
throw new DocumentException(MessageLocalization.getComposedMessage("irregular.columns.are.not.supported.in.composite.mode"));
linesWritten = 0;
descender = 0;
boolean firstPass = adjustFirstLine;
main_loop: while (true) {
if (compositeElements.isEmpty()) {
return NO_MORE_TEXT;
}
Element element = compositeElements.getFirst();
if (element.type() == Element.PARAGRAPH) {
Paragraph para = (Paragraph) element;
int status = 0;
for (int keep = 0; keep < 2; ++keep) {
float lastY = yLine;
boolean createHere = false;
if (compositeColumn == null) {
compositeColumn = new ColumnText(canvas);
compositeColumn.setUseAscender(firstPass && useAscender);
compositeColumn.setAlignment(para.getAlignment());
compositeColumn.setIndent(para.getIndentationLeft() + para.getFirstLineIndent());
compositeColumn.setExtraParagraphSpace(para.getExtraParagraphSpace());
compositeColumn.setFollowingIndent(para.getIndentationLeft());
compositeColumn.setRightIndent(para.getIndentationRight());
compositeColumn.setLeading(para.getLeading(), para.getMultipliedLeading());
compositeColumn.setRunDirection(para.getRunDirection() == PdfWriter.RUN_DIRECTION_DEFAULT ? runDirection : para.getRunDirection());
compositeColumn.setArabicOptions(arabicOptions);
compositeColumn.setSpaceCharRatio(spaceCharRatio);
compositeColumn.addText(para);
if (!firstPass) {
yLine -= para.getSpacingBefore();
}
createHere = true;
}
compositeColumn.leftX = leftX;
compositeColumn.rightX = rightX;
compositeColumn.yLine = yLine;
compositeColumn.rectangularWidth = rectangularWidth;
compositeColumn.rectangularMode = rectangularMode;
compositeColumn.minY = minY;
compositeColumn.maxY = maxY;
boolean keepCandidate = (para.getKeepTogether() && createHere && !firstPass);
status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
updateFilledWidth(compositeColumn.filledWidth);
if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
compositeColumn = null;
yLine = lastY;
return NO_MORE_COLUMN;
}
if (simulate || !keepCandidate)
break;
if (keep == 0) {
compositeColumn = null;
yLine = lastY;
}
}
firstPass = false;
if (compositeColumn != null) {
yLine = compositeColumn.yLine;
linesWritten += compositeColumn.linesWritten;
descender = compositeColumn.descender;
}
if ((status & NO_MORE_TEXT) != 0) {
compositeColumn = null;
compositeElements.removeFirst();
yLine -= para.getSpacingAfter();
}
if ((status & NO_MORE_COLUMN) != 0) {
return NO_MORE_COLUMN;
}
} else if (element.type() == Element.LIST) {
com.lowagie.text.List list = (com.lowagie.text.List) element;
java.util.List<Element> items = list.getItems();
ListItem item = null;
float listIndentation = list.getIndentationLeft();
int count = 0;
Stack<Object[]> stack = new Stack<>();
for (int k = 0; k < items.size(); ++k) {
Object obj = items.get(k);
if (obj instanceof ListItem) {
if (count == listIdx) {
item = (ListItem) obj;
break;
} else
++count;
} else if (obj instanceof com.lowagie.text.List) {
stack.push(new Object[] { list, k, listIndentation });
list = (com.lowagie.text.List) obj;
items = list.getItems();
listIndentation += list.getIndentationLeft();
k = -1;
continue;
}
if (k == items.size() - 1) {
if (!stack.isEmpty()) {
Object[] objs = stack.pop();
list = (com.lowagie.text.List) objs[0];
items = list.getItems();
k = (Integer) objs[1];
listIndentation = (Float) objs[2];
}
}
}
int status = 0;
for (int keep = 0; keep < 2; ++keep) {
float lastY = yLine;
boolean createHere = false;
if (compositeColumn == null) {
if (item == null) {
listIdx = 0;
compositeElements.removeFirst();
continue main_loop;
}
compositeColumn = new ColumnText(canvas);
compositeColumn.setUseAscender(firstPass && useAscender);
compositeColumn.setAlignment(item.getAlignment());
compositeColumn.setIndent(item.getIndentationLeft() + listIndentation + item.getFirstLineIndent());
compositeColumn.setExtraParagraphSpace(item.getExtraParagraphSpace());
compositeColumn.setFollowingIndent(compositeColumn.getIndent());
compositeColumn.setRightIndent(item.getIndentationRight() + list.getIndentationRight());
compositeColumn.setLeading(item.getLeading(), item.getMultipliedLeading());
compositeColumn.setRunDirection(runDirection);
compositeColumn.setArabicOptions(arabicOptions);
compositeColumn.setSpaceCharRatio(spaceCharRatio);
compositeColumn.addText(item);
if (!firstPass) {
yLine -= item.getSpacingBefore();
}
createHere = true;
}
compositeColumn.leftX = leftX;
compositeColumn.rightX = rightX;
compositeColumn.yLine = yLine;
compositeColumn.rectangularWidth = rectangularWidth;
compositeColumn.rectangularMode = rectangularMode;
compositeColumn.minY = minY;
compositeColumn.maxY = maxY;
boolean keepCandidate = (item != null && item.getKeepTogether() && createHere && !firstPass);
status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
updateFilledWidth(compositeColumn.filledWidth);
if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
compositeColumn = null;
yLine = lastY;
return NO_MORE_COLUMN;
}
if (simulate || !keepCandidate)
break;
if (keep == 0) {
compositeColumn = null;
yLine = lastY;
}
}
firstPass = false;
yLine = compositeColumn.yLine;
linesWritten += compositeColumn.linesWritten;
descender = compositeColumn.descender;
if (!Float.isNaN(compositeColumn.firstLineY) && !compositeColumn.firstLineYDone) {
if (!simulate && item != null) {
showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(item.getListSymbol()), compositeColumn.leftX + listIndentation, compositeColumn.firstLineY, 0);
}
compositeColumn.firstLineYDone = true;
}
if ((status & NO_MORE_TEXT) != 0) {
compositeColumn = null;
++listIdx;
if (item != null) {
yLine -= item.getSpacingAfter();
}
}
if ((status & NO_MORE_COLUMN) != 0)
return NO_MORE_COLUMN;
} else if (element.type() == Element.PTABLE) {
// don't write anything in the current column if there's no more space available
if (yLine < minY || yLine > maxY)
return NO_MORE_COLUMN;
// get the PdfPTable element
PdfPTable table = (PdfPTable) element;
// we ignore tables without a body
if (table.size() <= table.getHeaderRows()) {
compositeElements.removeFirst();
continue;
}
// offsets
float yTemp = yLine;
if (!firstPass && listIdx == 0)
yTemp -= table.spacingBefore();
float yLineWrite = yTemp;
// don't write anything in the current column if there's no more space available
if (yTemp < minY || yTemp > maxY)
return NO_MORE_COLUMN;
// coordinates
currentLeading = 0;
float x1 = leftX;
float tableWidth;
if (table.isLockedWidth()) {
tableWidth = table.getTotalWidth();
updateFilledWidth(tableWidth);
} else {
tableWidth = rectangularWidth * table.getWidthPercentage() / 100f;
table.setTotalWidth(tableWidth);
}
// how many header rows are real header rows; how many are footer rows?
int headerRows = table.getHeaderRows();
int footerRows = table.getFooterRows();
if (footerRows > headerRows)
footerRows = headerRows;
int realHeaderRows = headerRows - footerRows;
float headerHeight = table.getHeaderHeight();
float footerHeight = table.getFooterHeight();
// make sure the header and footer fit on the page
boolean skipHeader = (!firstPass && table.isSkipFirstHeader() && listIdx <= headerRows);
if (!skipHeader) {
yTemp -= headerHeight;
if (yTemp < minY || yTemp > maxY) {
if (firstPass) {
compositeElements.removeFirst();
continue;
}
return NO_MORE_COLUMN;
}
}
// how many real rows (not header or footer rows) fit on a page?
int k;
if (listIdx < headerRows)
listIdx = headerRows;
if (!table.isComplete())
yTemp -= footerHeight;
for (k = listIdx; k < table.size(); ++k) {
float rowHeight = table.getRowHeight(k);
if (yTemp - rowHeight < minY)
break;
yTemp -= rowHeight;
}
if (!table.isComplete())
yTemp += footerHeight;
// either k is the first row that doesn't fit on the page (break);
if (k < table.size()) {
if (table.isSplitRows() && (!table.isSplitLate() || (k == listIdx && firstPass))) {
if (!splittedRow) {
splittedRow = true;
table = new PdfPTable(table);
compositeElements.set(0, table);
List<PdfPRow> rows = table.getRows();
for (int i = headerRows; i < listIdx; ++i) rows.set(i, null);
}
float h = yTemp - minY;
PdfPRow newRow = table.getRow(k).splitRow(table, k, h);
if (newRow == null) {
if (k == listIdx)
return NO_MORE_COLUMN;
} else {
yTemp = minY;
table.getRows().add(++k, newRow);
}
} else if (!table.isSplitRows() && k == listIdx && firstPass) {
return NO_MORE_COLUMN;
} else if (k == listIdx && !firstPass && (!table.isSplitRows() || table.isSplitLate()) && (table.getFooterRows() == 0 || table.isComplete()))
return NO_MORE_COLUMN;
}
// or k is the number of rows in the table (for loop was done).
firstPass = false;
// we draw the table (for real now)
if (!simulate) {
// set the alignment
switch(table.getHorizontalAlignment()) {
case Element.ALIGN_LEFT:
break;
case Element.ALIGN_RIGHT:
x1 += rectangularWidth - tableWidth;
break;
default:
x1 += (rectangularWidth - tableWidth) / 2f;
}
// copy the rows that fit on the page in a new table nt
PdfPTable nt = PdfPTable.shallowCopy(table);
List<PdfPRow> sub = nt.getRows();
// first we add the real header rows (if necessary)
if (!skipHeader && realHeaderRows > 0) {
sub.addAll(table.getRows(0, realHeaderRows));
} else
nt.setHeaderRows(footerRows);
// then we add the real content
sub.addAll(table.getRows(listIdx, k));
// if k < table.size(), we must indicate that the new table is complete;
// otherwise no footers will be added (because iText thinks the table continues on the same page)
boolean showFooter = !table.isSkipLastFooter();
boolean newPageFollows = false;
if (k < table.size()) {
nt.setComplete(true);
showFooter = true;
newPageFollows = true;
}
// we add the footer rows if necessary (not for incomplete tables)
for (int j = 0; j < footerRows && nt.isComplete() && showFooter; ++j) sub.add(table.getRow(j + realHeaderRows));
// we need a correction if the last row needs to be extended
float rowHeight = 0;
int index = sub.size() - 1;
if (showFooter)
index -= footerRows;
PdfPRow last = sub.get(index);
if (table.isExtendLastRow(newPageFollows)) {
rowHeight = last.getMaxHeights();
last.setMaxHeights(yTemp - minY + rowHeight);
yTemp = minY;
}
// now we render the rows of the new table
if (canvases != null)
nt.writeSelectedRows(0, -1, x1, yLineWrite, canvases);
else
nt.writeSelectedRows(0, -1, x1, yLineWrite, canvas);
if (table.isExtendLastRow(newPageFollows)) {
last.setMaxHeights(rowHeight);
}
} else if (table.isExtendLastRow() && minY > PdfPRow.BOTTOM_LIMIT)
yTemp = minY;
yLine = yTemp;
if (!(skipHeader || table.isComplete()))
yLine += footerHeight;
if (k >= table.size()) {
yLine -= table.spacingAfter();
compositeElements.removeFirst();
splittedRow = false;
listIdx = 0;
} else {
if (splittedRow) {
List<PdfPRow> rows = table.getRows();
for (int i = listIdx; i < k; ++i) rows.set(i, null);
}
listIdx = k;
return NO_MORE_COLUMN;
}
} else if (element.type() == Element.YMARK) {
if (!simulate) {
DrawInterface zh = (DrawInterface) element;
zh.draw(canvas, leftX, minY, rightX, maxY, yLine);
}
compositeElements.removeFirst();
} else
compositeElements.removeFirst();
}
}
use of com.lowagie.text.Element in project OpenPDF by LibrePDF.
the class SAXiTextHandler method handleEndingTags.
/**
* This method deals with the starting tags.
*
* @param name the name of the tag
*/
public void handleEndingTags(String name) {
if (ElementTags.IGNORE.equals(name)) {
ignore = false;
return;
}
if (ignore)
return;
// tags that don't have any content
if (isNewpage(name) || ElementTags.ANNOTATION.equals(name) || ElementTags.IMAGE.equals(name) || isNewline(name)) {
return;
}
try {
// titles of sections and chapters
if (ElementTags.TITLE.equals(name)) {
Paragraph current = (Paragraph) stack.pop();
if (currentChunk != null) {
current.add(currentChunk);
currentChunk = null;
}
Section previous = (Section) stack.pop();
previous.setTitle(current);
stack.push(previous);
return;
}
// all other endtags
if (currentChunk != null) {
TextElementArray current;
try {
current = (TextElementArray) stack.pop();
} catch (EmptyStackException ese) {
current = new Paragraph();
}
current.add(currentChunk);
stack.push(current);
currentChunk = null;
}
// chunks
if (ElementTags.CHUNK.equals(name)) {
return;
}
// phrases, anchors, lists, tables
if (ElementTags.PHRASE.equals(name) || ElementTags.ANCHOR.equals(name) || ElementTags.LIST.equals(name) || ElementTags.PARAGRAPH.equals(name)) {
Element current = stack.pop();
try {
TextElementArray previous = (TextElementArray) stack.pop();
previous.add(current);
stack.push(previous);
} catch (EmptyStackException ese) {
document.add(current);
}
return;
}
// listitems
if (ElementTags.LISTITEM.equals(name)) {
ListItem listItem = (ListItem) stack.pop();
List list = (List) stack.pop();
list.add(listItem);
stack.push(list);
}
// tables
if (ElementTags.TABLE.equals(name)) {
Table table = (Table) stack.pop();
try {
TextElementArray previous = (TextElementArray) stack.pop();
previous.add(table);
stack.push(previous);
} catch (EmptyStackException ese) {
document.add(table);
}
return;
}
// rows
if (ElementTags.ROW.equals(name)) {
java.util.List<Cell> cells = new ArrayList<>();
int columns = 0;
Table table;
Cell cell;
while (true) {
Element element = stack.pop();
if (element.type() == Element.CELL) {
cell = (Cell) element;
columns += cell.getColspan();
cells.add(cell);
} else {
table = (Table) element;
break;
}
}
if (table.getColumns() < columns) {
table.addColumns(columns - table.getColumns());
}
Collections.reverse(cells);
String width;
float[] cellWidths = new float[columns];
boolean[] cellNulls = new boolean[columns];
for (int i = 0; i < columns; i++) {
cellWidths[i] = 0;
cellNulls[i] = true;
}
float total = 0.0f;
int j = 0;
for (Cell value : cells) {
cell = value;
width = cell.getWidthAsString();
if (cell.getWidth() == 0) {
if (cell.getColspan() == 1 && cellWidths[j] == 0) {
try {
cellWidths[j] = 100.0f / columns;
total += cellWidths[j];
} catch (Exception e) {
// empty on purpose
}
} else if (cell.getColspan() == 1) {
cellNulls[j] = false;
}
} else if (cell.getColspan() == 1 && width.endsWith("%")) {
try {
cellWidths[j] = Float.parseFloat(width.substring(0, width.length() - 1) + "f");
total += cellWidths[j];
cellNulls[j] = false;
} catch (Exception e) {
// empty on purpose
}
}
j += cell.getColspan();
table.addCell(cell);
}
float[] widths = table.getProportionalWidths();
if (widths.length == columns) {
float left = 0.0f;
for (int i = 0; i < columns; i++) {
if (cellNulls[i] && widths[i] != 0) {
left += widths[i];
cellWidths[i] = widths[i];
}
}
if (100.0 >= total) {
for (int i = 0; i < widths.length; i++) {
if (cellWidths[i] == 0 && widths[i] != 0) {
cellWidths[i] = (widths[i] / left) * (100.0f - total);
}
}
}
table.setWidths(cellWidths);
}
stack.push(table);
}
// cells
if (ElementTags.CELL.equals(name)) {
return;
}
// sections
if (ElementTags.SECTION.equals(name)) {
stack.pop();
return;
}
// chapters
if (ElementTags.CHAPTER.equals(name)) {
document.add(stack.pop());
return;
}
// the documentroot
if (isDocumentRoot(name)) {
try {
while (true) {
Element element = stack.pop();
try {
TextElementArray previous = (TextElementArray) stack.pop();
previous.add(element);
stack.push(previous);
} catch (EmptyStackException es) {
document.add(element);
}
}
} catch (EmptyStackException ese) {
// empty on purpose
}
if (controlOpenClose) {
document.close();
}
}
} catch (DocumentException de) {
throw new ExceptionConverter(de);
}
}
use of com.lowagie.text.Element in project OpenPDF by LibrePDF.
the class ParseNestedHtmlList method printElement.
private static void printElement(String depth, List<Element> elements) {
for (Element element : elements) {
System.out.println(depth + "- element.getClass() = " + element.getClass());
if (element instanceof com.lowagie.text.List) {
com.lowagie.text.List elementList = (com.lowagie.text.List) element;
printElement(depth + " ", elementList.getItems());
} else {
System.out.println(depth + " element = " + element.getChunks().get(0).toString());
}
}
}
use of com.lowagie.text.Element in project OpenPDF by LibrePDF.
the class ParseNestedHtmlList method main.
/**
* Generates an HTML page with the text 'Hello World'
*
* @param args no arguments needed here
*/
public static void main(String[] args) {
System.out.println("Parse Nested HTML List");
try {
final String htmlText = "<html>" + "<body>" + "<p>What should you say?</p>" + "<ul>" + " <li>Hello</li>" + " <li>World</li>" + "</ul>" + "<ol>" + " <li>Element-1" + " <ol>" + " <li>Element-1-1</li>" + " <li>Element-1-2</li>" + " </ol>" + " </li>" + " <li>Element-2" + " <ol>" + " <li>Element-2-1" + " <ol>" + " <li>Element-2-1-1" + " <ol>" + " <li>Element-2-1-1-1</li>" + " <li>Element-2-1-1-2</li>" + " </ol>" + " </li>" + " <li>Element-2-1-2" + " <ol>" + " <li>Element-2-1-2-1</li>" + " <li>Element-2-1-2-2</li>" + " </ol>" + " </li>" + " </ol>" + " </li>" + " <li>Element-2-2</li>" + " </ol>" + " </li>" + "</ol>" + "</body>" + "</html>";
final StringReader reader = new StringReader(htmlText);
final StyleSheet styleSheet = new StyleSheet();
final Map<String, Object> interfaceProps = new HashMap<>();
final List<Element> elements = HTMLWorker.parseToList(reader, styleSheet, interfaceProps);
printElement("", elements);
} catch (DocumentException | IOException de) {
System.err.println(de.getMessage());
}
}
Aggregations