/**
   * Write out the columns. After writing, use {@link #isOverflow()} to see if all text was written.
   *
   * @param canvas PdfContentByte to write with
   * @param document document to write to (only used to get page limit info)
   * @param documentY starting y position to begin writing at
   * @return the current height (y position) after writing the columns
   * @throws DocumentException on error
   */
  public float write(PdfContentByte canvas, PdfDocument document, float documentY)
      throws DocumentException {
    this.document = document;
    columnText.setCanvas(canvas);
    if (columnDefs.isEmpty()) {
      throw new DocumentException("MultiColumnText has no columns");
    }
    overflow = false;
    float currentHeight = 0;
    boolean done = false;
    try {
      while (!done) {
        if (top == AUTOMATIC) {
          top =
              document.getVerticalPosition(
                  true); // RS - 07/07/2005 - Get current doc writing position for top of columns on
          // new page.
        } else if (nextY == AUTOMATIC) {
          nextY =
              document.getVerticalPosition(
                  true); // RS - 07/07/2005 - - Get current doc writing position for top of columns
          // on new page.
        }
        ColumnDef currentDef = (ColumnDef) columnDefs.get(getCurrentColumn());
        columnText.setYLine(top);

        float[] left = currentDef.resolvePositions(Rectangle.LEFT);
        float[] right = currentDef.resolvePositions(Rectangle.RIGHT);
        if (document.isMarginMirroring() && document.getPageNumber() % 2 == 0) {
          float delta = document.rightMargin() - document.left();
          left = (float[]) left.clone();
          right = (float[]) right.clone();
          for (int i = 0; i < left.length; i += 2) {
            left[i] -= delta;
          }
          for (int i = 0; i < right.length; i += 2) {
            right[i] -= delta;
          }
        }

        currentHeight = Math.max(currentHeight, getHeight(left, right));

        if (currentDef.isSimple()) {
          columnText.setSimpleColumn(left[2], left[3], right[0], right[1]);
        } else {
          columnText.setColumns(left, right);
        }

        int result = columnText.go();
        if ((result & ColumnText.NO_MORE_TEXT) != 0) {
          done = true;
          top = columnText.getYLine();
        } else if (shiftCurrentColumn()) {
          top = nextY;
        } else { // check if we are done because of height
          totalHeight += currentHeight;
          if ((desiredHeight != AUTOMATIC) && (totalHeight >= desiredHeight)) {
            overflow = true;
            break;
          } else { // need to start new page and reset the columns
            documentY = nextY;
            newPage();
            currentHeight = 0;
          }
        }
      }
    } catch (DocumentException ex) {
      ex.printStackTrace();
      throw ex;
    }
    if (desiredHeight == AUTOMATIC && columnDefs.size() == 1) {
      currentHeight = documentY - columnText.getYLine();
    }
    return currentHeight;
  }
 /**
  * Add a new column. The parameters are limits for each column wall in the format of a sequence of
  * points (x1,y1,x2,y2,...).
  *
  * @param left limits for left column
  * @param right limits for right column
  */
 public void addColumn(float[] left, float[] right) {
   ColumnDef nextDef = new ColumnDef(left, right);
   if (!nextDef.isSimple()) simple = false;
   columnDefs.add(nextDef);
 }