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); }
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(); }