private boolean addToTwoColumns(boolean simulate, float height) {
    ColumnTextBuilder ctb;
    int status;
    ctb = b.reuseColumnTextBuilder();

    b.reuseRectangleBuilder(tempR).copyPositionsFrom(rectangle);

    final float horCenter = horCenter();

    setColumn(height, horCenter, true, ctb, simulate);

    contentAdder.add(ctb, simulate);

    status = ctb.go(simulate);

    yLine = ctb.getYLine();

    if (!ColumnText.hasMoreText(status) && simulate) {
      return true;
    }

    setColumn(height, horCenter, false, ctb, simulate);

    status = ctb.go(simulate);

    yLine = Math.min(yLine, ctb.getYLine());

    // right column may not fit the rect, check if does fit the page
    if (simulate) {
      if (yLine < rectangle.getBottom()) {
        return false;
      }
    }

    return !ColumnText.hasMoreText(status);
  }
  public boolean fits() {
    final boolean simulate = true;

    // try adding into a single infinite column to calc height
    ColumnTextBuilder ctb = b.reuseColumnTextBuilder();

    b.reuseRectangleBuilder(tempR).copyPositionsFrom(rectangle);

    tempR.setBottom(-10000f);
    tempR.setRight(horCenter());

    applyPadding(tempR, true);

    ctb.setSimpleColumn(tempR);

    float yBefore = ctb.getYLine();

    contentAdder.add(ctb, simulate);

    int status = ctb.go(simulate);

    if (ColumnText.hasMoreText(status)) {
      return false;
    }

    float yAfter = ctb.getYLine();

    final float height = yBefore - yAfter;

    logger.trace("height: {}", height);

    //        if(height > rectangle.getHeight()) {
    //            return false;
    //        }

    // now try adding into two actual columns
    final float columnHeight = height / 2 + additionalSpaceForColumn;

    if (!addToTwoColumns(simulate, columnHeight)) {
      return false;
    }

    addToTwoColumns(false, columnHeight);

    return true;
  }
  @Override
  public void postProcess(ITextContext context, File fileIn, File fileOut) {
    FileInputStream in = null;
    FileOutputStream out = null;

    try {
      in = new FileInputStream(fileIn);
      out = new FileOutputStream(fileOut);

      PageNumber pageNumber = context.pageNumber();

      int startPage = pageNumber.lookupFrontMatterLastPage();
      ColumnText ct = generateTableOfContent(context);
      pageNumber.continueFrontMatter();

      PdfReader reader = new PdfReader(in);
      Rectangle pageSize = reader.getPageSize(1);
      PdfStamper stamper = new PdfStamper(reader, out);
      while (true) {
        stamper.insertPage(++startPage, pageSize);

        PdfContentByte under = stamper.getUnderContent(startPage);
        pageNumber.notifyPageChange();
        headerFooter.drawFooter(under, pageNumber.pageInfos());

        PdfContentByte canvas = stamper.getOverContent(startPage);
        ct.setCanvas(canvas);
        ct.setSimpleColumn(36, 36, 559, 770);
        if (!ColumnText.hasMoreText(ct.go())) break;
      }
      stamper.close();

    } catch (FileNotFoundException e) {
      log.error("Unable to reopen temporary generated file ({})", fileIn, e);
    } catch (DocumentException e) {
      log.error("Error during report post-processing from: {}, to: {}", fileIn, fileOut, e);
    } catch (IOException e) {
      log.error("Error during report post-processing from: {}, to: {}", fileIn, fileOut, e);
    } finally {
      IOUtils.closeQuietly(out);
      IOUtils.closeQuietly(in);
    }
  }
  private List<ColumnText> fillTable(float height) {
    // copy text for simulation
    List<ColumnText> tt = null;
    if (breakHandlingParent == null && colIdx >= layoutTable.getNumberOfColumns()) {
      // more column breaks than available column
      // we try not to lose content
      // but results may be different than in open office
      // anyway it is logical error made by document creator
      tt = new ArrayList<ColumnText>();
      ColumnText t = createColumnText();
      tt.add(t);
      for (int i = 0; i < texts.size(); i++) {
        PdfPTable table = new PdfPTable(1);
        table.setWidthPercentage(100.0f);
        PdfPCell cell = new PdfPCell();
        cell.setBorder(Rectangle.NO_BORDER);
        cell.setPadding(0.0f);
        cell.setColumn(ColumnText.duplicate(texts.get(i)));
        table.addCell(cell);
        t.addElement(table);
      }
    } else {
      tt = new ArrayList<ColumnText>(texts);
      for (int i = 0; i < tt.size(); i++) {
        tt.set(i, ColumnText.duplicate(tt.get(i)));
      }
    }
    // clear layout table
    clearTable(layoutTable, true);
    setWidthIfNecessary();

    // try to fill cells with text
    ColumnText t = tt.get(0);
    for (PdfPCell cell : layoutTable.getRow(0).getCells()) {
      cell.setFixedHeight(height >= 0.0f ? height : -1.0f);
      cell.setColumn(ColumnText.duplicate(t));
      //
      t.setSimpleColumn(
          cell.getLeft() + cell.getPaddingLeft(),
          height >= 0.0f ? -height : PdfPRow.BOTTOM_LIMIT,
          cell.getRight() - cell.getPaddingRight(),
          0);
      int res = 0;
      try {
        res = t.go(true);
      } catch (DocumentException e) {
        throw new XWPFConverterException(e);
      }
      if (!ColumnText.hasMoreText(res)) {
        // no overflow in current column
        if (tt.size() == 1) {
          // no more text
          return null;
        } else {
          // some text waiting for new column
          tt.remove(0);
          t = tt.get(0);
        }
      }
    }
    return tt;
  }
    public Result go() {
      if (quickHeight != 0) {
        if (rightCTB != null) {
          throw new IllegalStateException("if quickHeight !=0 then rightCTB == null!");
        }
      }

      Preconditions.checkNotNull(dest);

      ColumnTextBuilder currentCtb = dest;
      List<Element> elements = sequence.getElements();

      int i;

      if (quickHeight != 0) {
        currentCtb.adjustBottom((float) quickHeight);
      }

      if (startWith != null) {
        currentCtb.copyContentFrom(startWith);

        float yBefore = currentCtb.getYLine();

        int status = currentCtb.go(simulate);

        if (setHeights) {
          startContentHeight = yBefore - currentCtb.getYLine();
        }

        if (ColumnText.hasMoreText(status)) {
          if (rightCTB != null) { // => quickHeight == 0
            rightCTB.copyContentFrom(currentCtb);

            currentCtb = rightCTB;

            yBefore = currentCtb.getYLine();

            status = currentCtb.go(simulate);

            if (setHeights) {
              startContentHeight += yBefore - currentCtb.getYLine();
            }

            if (ColumnText.hasMoreText(status)) {
              return new Result(ColumnText.NO_MORE_COLUMN, startAtIndex, currentCtb);
            }
          } else {
            return new Result(ColumnText.NO_MORE_COLUMN, startAtIndex, currentCtb);
          }
        }
      }

      // optimisation mode
      if (quickHeight != 0) {
        for (i = startAtIndex; i < elements.size(); i++) {
          Element el = elements.get(i);

          if (currentCtb.fits(el)) {
            if (el instanceof SpaceElement) {
              SpaceElement spaceElement = (SpaceElement) el;
              spaceElement.add(currentCtb, simulate);
              currentCtb.go(simulate);
            } else {
              currentCtb.addElement(el).go(simulate);
            }
          } else {
            break;
          }
        }

        return new Result(ColumnText.NO_MORE_TEXT, i, null);
      }

      for (i = startAtElement; i < elements.size(); i++) {
        Element el = elements.get(i);

        float yBefore = currentCtb.getYLine();

        if (el instanceof SpaceElement) {
          SpaceElement space = (SpaceElement) el;

          if (space.fits(currentCtb, currentCtb.getBottom())) {
            space.add(currentCtb, simulate);
          } else {
            if (currentCtb == dest) {
              currentCtb = rightCTB;
            } else if (currentCtb == rightCTB) {
              return new Result(ColumnText.NO_MORE_COLUMN, i + 1, currentCtb.clearContent());
            }
          }
        } else {
          currentCtb.addElement(el);

          if (ColumnText.hasMoreText(currentCtb.go(simulate))) {
            if (currentCtb == dest) {
              if (rightCTB == null) {
                return new Result(ColumnText.NO_MORE_COLUMN, i + 1, currentCtb);
              } else {
                rightCTB.copyContentFrom(currentCtb);

                currentCtb = rightCTB;

                final int status = currentCtb.go(simulate);

                if (ColumnText.hasMoreText(status)) {
                  return new Result(ColumnText.NO_MORE_COLUMN, i + 1, currentCtb);
                }
              }
            } else {
              return new Result(ColumnText.NO_MORE_COLUMN, i + 1, currentCtb);
            }
          }
        }

        if (setHeights) {
          sequence.setHeight(i, yBefore - currentCtb.getYLine());
        }
      }

      return new Result(ColumnText.NO_MORE_TEXT, elements.size(), null);
    }
Пример #6
0
  public static void createPdf2(
      List<Participant> participants,
      boolean exportName,
      boolean exportGroup,
      boolean exportRenseignement,
      OutputStream out)
      throws IOException, DocumentException {
    Document document = new Document(PageSize.A4.rotate());
    // document.setMargins(0,0,0,0);
    PdfWriter writer = PdfWriter.getInstance(document, out);
    document.open();
    PdfContentByte cb = writer.getDirectContent();

    float documentTop = document.top();
    float documentBottom = document.bottom();
    float documentHeight = documentTop - documentBottom;
    float left = document.left();
    float right = document.right();
    float width = right - left;

    cb.rectangle(left, documentBottom, width, documentHeight);
    cb.stroke();

    float nameHeightPercent = 0.35f;
    float groupHeightPercent = 0.25f;

    float nameTop = documentTop;
    float nameBottom = nameTop;
    if (exportName) {
      nameBottom = nameTop - (documentHeight * nameHeightPercent);
    }
    float groupeTop = nameBottom;
    float groupeBottom = nameBottom;
    if (exportGroup) {
      groupeBottom = groupeTop - (documentHeight * groupHeightPercent);
    }
    float barcodeTop = groupeBottom;
    float barcodeBottom = documentBottom;

    ColumnText columnText;

    for (Participant participant : participants) {

      float nameFontSize = 65f;
      float groupFontSize = 45f;
      float renseignementFontSize = 35f;

      if (exportName) {
        columnText = new ColumnText(cb);

        columnText.setSimpleColumn(left, nameTop, right, nameBottom);
        // cb.rectangle(left, nameBottom, width, (nameTop - nameBottom));
        // cb.stroke();

        columnText.setExtraParagraphSpace(0f);
        columnText.setAdjustFirstLine(false);
        columnText.setIndent(0);

        String txt = participant.getNom().toUpperCase() + " " + participant.getPrenom();

        float previousPos = columnText.getYLine();
        columnText.setText(null);
        columnText.addElement(createCleanParagraph(txt, nameFontSize, true));
        while (ColumnText.hasMoreText(columnText.go(true))) {
          nameFontSize = nameFontSize - 0.5f;
          columnText.setText(null);
          columnText.addElement(createCleanParagraph(txt, nameFontSize, true));
          columnText.setYLine(previousPos);
        }

        columnText.setText(null);
        columnText.addElement(createCleanParagraph(txt, nameFontSize, true));
        columnText.setYLine(previousPos);
        columnText.go(false);
      }

      if (exportGroup) {
        columnText = new ColumnText(cb);

        columnText.setSimpleColumn(document.left(), groupeTop, document.right(), groupeBottom);
        float groupeHeight = groupeTop - groupeBottom;
        // cb.rectangle(document.left(), groupeTop - groupeHeight, document.right() -
        // document.left(), groupeHeight);
        // cb.stroke();

        columnText.setExtraParagraphSpace(0f);
        columnText.setAdjustFirstLine(false);
        columnText.setIndent(0);
        columnText.setFollowingIndent(0);

        String txt1 = participant.getGroupe();
        String txt2 = exportRenseignement ? participant.getRenseignements() : null;

        float previousPos = columnText.getYLine();
        columnText.setText(null);
        // columnText.addElement(createCleanParagraph(txt1,groupFontSize,true,txt2,renseignementFontSize,false));
        columnText.addElement(createCleanParagraph(txt1, groupFontSize, true));
        columnText.addElement(createCleanParagraph(txt2, renseignementFontSize, false));
        while (ColumnText.hasMoreText(columnText.go(true))) {
          groupFontSize = groupFontSize - 0.5f;
          renseignementFontSize = renseignementFontSize - 0.5f;
          columnText.setText(null);
          // columnText.addElement(createCleanParagraph(txt1,groupFontSize,true,txt2,renseignementFontSize,false));
          columnText.addElement(createCleanParagraph(txt1, groupFontSize, true));
          columnText.addElement(createCleanParagraph(txt2, renseignementFontSize, false));
          columnText.setYLine(previousPos);
        }

        columnText.setText(null);
        // columnText.addElement(createCleanParagraph(txt1,groupFontSize,true,txt2,renseignementFontSize,false));
        columnText.addElement(createCleanParagraph(txt1, groupFontSize, true));
        columnText.addElement(createCleanParagraph(txt2, renseignementFontSize, false));
        columnText.setYLine(previousPos);
        columnText.go(false);
      }

      {
        columnText = new ColumnText(cb);

        barcodeTop = barcodeTop - 12f;
        columnText.setSimpleColumn(left, barcodeTop, right, barcodeBottom);
        float barcodeHeight = barcodeTop - barcodeBottom;
        // cb.rectangle(left, barcodeTop - barcodeHeight, width, barcodeHeight);
        // cb.stroke();

        columnText.setExtraParagraphSpace(0f);
        columnText.setAdjustFirstLine(false);
        columnText.setIndent(0);

        float previousPos = columnText.getYLine();
        columnText.setText(null);
        columnText.addElement(
            createCleanBarcode(cb, participant.getNumero(), width, barcodeHeight));
        columnText.go(false);
      }

      document.newPage();
    }

    document.close();
  }