Search in sources :

Example 11 with Element

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;
}
Also used : Element(com.lowagie.text.Element) ArrayList(java.util.ArrayList) Chunk(com.lowagie.text.Chunk)

Example 12 with Element

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();
    }
}
Also used : Element(com.lowagie.text.Element) DrawInterface(com.lowagie.text.pdf.draw.DrawInterface) Phrase(com.lowagie.text.Phrase) Paragraph(com.lowagie.text.Paragraph) Stack(java.util.Stack) DocumentException(com.lowagie.text.DocumentException) ArrayList(java.util.ArrayList) List(java.util.List) LinkedList(java.util.LinkedList) ListItem(com.lowagie.text.ListItem)

Example 13 with Element

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);
    }
}
Also used : Table(com.lowagie.text.Table) Element(com.lowagie.text.Element) ArrayList(java.util.ArrayList) Section(com.lowagie.text.Section) BadElementException(com.lowagie.text.BadElementException) EmptyStackException(java.util.EmptyStackException) DocumentException(com.lowagie.text.DocumentException) Paragraph(com.lowagie.text.Paragraph) EmptyStackException(java.util.EmptyStackException) ExceptionConverter(com.lowagie.text.ExceptionConverter) TextElementArray(com.lowagie.text.TextElementArray) DocumentException(com.lowagie.text.DocumentException) ArrayList(java.util.ArrayList) List(com.lowagie.text.List) ListItem(com.lowagie.text.ListItem) Cell(com.lowagie.text.Cell)

Example 14 with Element

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());
        }
    }
}
Also used : Element(com.lowagie.text.Element) List(java.util.List)

Example 15 with Element

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());
    }
}
Also used : StyleSheet(com.lowagie.text.html.simpleparser.StyleSheet) HashMap(java.util.HashMap) Element(com.lowagie.text.Element) DocumentException(com.lowagie.text.DocumentException) StringReader(java.io.StringReader) IOException(java.io.IOException)

Aggregations

Element (com.lowagie.text.Element)24 DocumentException (com.lowagie.text.DocumentException)13 Paragraph (com.lowagie.text.Paragraph)13 ArrayList (java.util.ArrayList)12 Chunk (com.lowagie.text.Chunk)9 ListItem (com.lowagie.text.ListItem)9 List (com.lowagie.text.List)8 ExceptionConverter (com.lowagie.text.ExceptionConverter)7 Phrase (com.lowagie.text.Phrase)7 TextElementArray (com.lowagie.text.TextElementArray)7 Section (com.lowagie.text.Section)6 IOException (java.io.IOException)6 Iterator (java.util.Iterator)6 BadElementException (com.lowagie.text.BadElementException)5 Table (com.lowagie.text.Table)5 Annotation (com.lowagie.text.Annotation)4 Image (com.lowagie.text.Image)4 EmptyStackException (java.util.EmptyStackException)4 Cell (com.lowagie.text.Cell)3 Font (com.lowagie.text.Font)3