/** * Adds an iText element to the cell. * @param element */ public void AddElement(IElement element) { if (table != null) { table = null; column.SetText(null); } column.AddElement(element); }
// =========================================================================== public override void Write(Stream stream) { // step 1 using (Document document = new Document()) { // step 2 PdfWriter writer = PdfWriter.GetInstance(document, stream); // step 3 document.Open(); // step 4 PdfContentByte canvas = writer.DirectContent; DrawRectangles(canvas); ColumnText ct = new ColumnText(canvas); ct.Alignment = Element.ALIGN_JUSTIFIED; ct.Leading = 14; int column = 0; ct.SetColumns( new float[] { 36, 806, 36, 670, 108, 670, 108, 596, 36, 596, 36, 36 }, new float[] { 296, 806, 296, 484, 259, 484, 259, 410, 296, 410, 296, 36 } ); ct.SetColumns(LEFT[column], RIGHT[column]); // ct.SetColumns(LEFT[column], RIGHT[column]); // iText-ONLY, 'Initial value of the status' => 0 // iTextSharp **DOES NOT** include this member variable // int status = ColumnText.START_COLUMN; int status = 0; Phrase p; float y; IEnumerable<Movie> movies = PojoFactory.GetMovies(); foreach (Movie movie in movies) { y = ct.YLine; p = CreateMovieInformation(movie); ct.AddText(p); status = ct.Go(true); if (ColumnText.HasMoreText(status)) { column = Math.Abs(column - 1); if (column == 0) { document.NewPage(); DrawRectangles(canvas); } ct.SetColumns(LEFT[column], RIGHT[column]); y = 806; } ct.YLine = y; ct.SetText(p); status = ct.Go(); } } }
// --------------------------------------------------------------------------- public void Write(Stream stream) { // step 1 using (Document document = new Document(PageSize.A4.Rotate())) { // step 2 PdfWriter writer = PdfWriter.GetInstance(document, stream); // step 3 document.Open(); // step 4 ColumnText ct = new ColumnText(writer.DirectContent); int column = 0; ct.SetSimpleColumn( COLUMNS[column, 0], COLUMNS[column, 1], COLUMNS[column, 2], COLUMNS[column, 3] ); // iText-ONLY, 'Initial value of the status' => 0 // iTextSharp **DOES NOT** include this member variable // int status = ColumnText.START_COLUMN; int status = 0; float y; Image img; IEnumerable<Movie> movies = PojoFactory.GetMovies(); foreach (Movie movie in movies) { y = ct.YLine; img = Image.GetInstance( Path.Combine(RESOURCE, movie.Imdb + ".jpg") ); img.ScaleToFit(80, 1000); AddContent(ct, movie, img); status = ct.Go(true); if (ColumnText.HasMoreText(status)) { column = (column + 1) % 4; if (column == 0) { document.NewPage(); } ct.SetSimpleColumn( COLUMNS[column, 0], COLUMNS[column, 1], COLUMNS[column, 2], COLUMNS[column, 3] ); y = COLUMNS[column, 3]; } ct.YLine = y; ct.SetText(null); AddContent(ct, movie, img); status = ct.Go(); } } }
/** * Adds an iText element to the cell. * @param element */ public void AddElement(IElement element) { if (table != null) { table = null; column.SetText(null); } if (element is PdfPTable) { ((PdfPTable)element).SplitLate = false; } column.AddElement(element); }
// =========================================================================== public override void Write(Stream stream) { // step 1 using (Document document = new Document()) { // step 2 PdfWriter writer = PdfWriter.GetInstance(document, stream); // step 3 document.Open(); // step 4 ColumnText ct = new ColumnText(writer.DirectContent); int column = 0; ct.SetSimpleColumn( COLUMNS[column][0], COLUMNS[column][1], COLUMNS[column][2], COLUMNS[column][3] ); // iText-ONLY, 'Initial value of the status' => 0 // iTextSharp **DOES NOT** include this member variable // int status = ColumnText.START_COLUMN; int status = 0; Phrase p; float y; IEnumerable<Movie> movies = PojoFactory.GetMovies(); foreach (Movie movie in movies) { y = ct.YLine; p = CreateMovieInformation(movie); ct.AddText(p); status = ct.Go(true); if (ColumnText.HasMoreText(status)) { column = Math.Abs(column - 1); if (column == 0) { document.NewPage(); } ct.SetSimpleColumn( COLUMNS[column][0], COLUMNS[column][1], COLUMNS[column][2], COLUMNS[column][3] ); y = COLUMNS[column][3]; } ct.YLine = y; ct.SetText(p); status = ct.Go(false); } } }
/** * Adds an iText element to the cell. * @param element */ virtual public void AddElement(IElement element) { if (table != null) { table = null; column.SetText(null); } if (element is PdfPTable) { ((PdfPTable)element).SplitLate = false; } else if (element is PdfDiv) { foreach (IElement divChildElement in ((PdfDiv)element).Content) { if (divChildElement is PdfPTable) { ((PdfPTable)divChildElement).SplitLate = false; } } } column.AddElement(element); }
/** * Get the <code>PdfAppearance</code> of a text or combo field * @throws IOException on error * @throws DocumentException on error * @return A <code>PdfAppearance</code> */ public PdfAppearance GetAppearance() { PdfAppearance app = GetBorderAppearance(); app.BeginVariableText(); if (text == null || text.Length == 0) { app.EndVariableText(); return(app); } bool borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET; float h = box.Height - borderWidth * 2 - extraMarginTop; float bw2 = borderWidth; if (borderExtra) { h -= borderWidth * 2; bw2 *= 2; } float offsetX = Math.Max(bw2, 1); float offX = Math.Min(bw2, offsetX); app.SaveState(); app.Rectangle(offX, offX, box.Width - 2 * offX, box.Height - 2 * offX); app.Clip(); app.NewPath(); String ptext; if ((options & PASSWORD) != 0) { ptext = ObfuscatePassword(text); } else if ((options & MULTILINE) == 0) { ptext = RemoveCRLF(text); } else { ptext = text; //fixed by Kazuya Ujihara (ujihara.jp) } BaseFont ufont = RealFont; BaseColor fcolor = (textColor == null) ? GrayColor.GRAYBLACK : textColor; int rtl = CheckRTL(ptext) ? PdfWriter.RUN_DIRECTION_LTR : PdfWriter.RUN_DIRECTION_NO_BIDI; float usize = fontSize; Phrase phrase = ComposePhrase(ptext, ufont, fcolor, usize); if ((options & MULTILINE) != 0) { float width = box.Width - 4 * offsetX - extraMarginLeft; float factor = ufont.GetFontDescriptor(BaseFont.BBOXURY, 1) - ufont.GetFontDescriptor(BaseFont.BBOXLLY, 1); ColumnText ct = new ColumnText(null); if (usize == 0) { usize = h / factor; if (usize > 4) { if (usize > 12) { usize = 12; } float step = Math.Max((usize - 4) / 10, 0.2f); ct.SetSimpleColumn(0, -h, width, 0); ct.Alignment = alignment; ct.RunDirection = rtl; for (; usize > 4; usize -= step) { ct.YLine = 0; ChangeFontSize(phrase, usize); ct.SetText(phrase); ct.Leading = factor * usize; int status = ct.Go(true); if ((status & ColumnText.NO_MORE_COLUMN) == 0) { break; } } } if (usize < 4) { usize = 4; } } ChangeFontSize(phrase, usize); ct.Canvas = app; float leading = usize * factor; float offsetY = offsetX + h - ufont.GetFontDescriptor(BaseFont.BBOXURY, usize); ct.SetSimpleColumn(extraMarginLeft + 2 * offsetX, -20000, box.Width - 2 * offsetX, offsetY + leading); ct.Leading = leading; ct.Alignment = alignment; ct.RunDirection = rtl; ct.SetText(phrase); ct.Go(); } else { if (usize == 0) { float maxCalculatedSize = h / (ufont.GetFontDescriptor(BaseFont.BBOXURX, 1) - ufont.GetFontDescriptor(BaseFont.BBOXLLY, 1)); ChangeFontSize(phrase, 1); float wd = ColumnText.GetWidth(phrase, rtl, 0); if (wd == 0) { usize = maxCalculatedSize; } else { usize = Math.Min(maxCalculatedSize, (box.Width - extraMarginLeft - 4 * offsetX) / wd); } if (usize < 4) { usize = 4; } } ChangeFontSize(phrase, usize); float offsetY = offX + ((box.Height - 2 * offX) - ufont.GetFontDescriptor(BaseFont.ASCENT, usize)) / 2; if (offsetY < offX) { offsetY = offX; } if (offsetY - offX < -ufont.GetFontDescriptor(BaseFont.DESCENT, usize)) { float ny = -ufont.GetFontDescriptor(BaseFont.DESCENT, usize) + offX; float dy = box.Height - offX - ufont.GetFontDescriptor(BaseFont.ASCENT, usize); offsetY = Math.Min(ny, Math.Max(offsetY, dy)); } if ((options & COMB) != 0 && maxCharacterLength > 0) { int textLen = Math.Min(maxCharacterLength, ptext.Length); int position = 0; if (alignment == Element.ALIGN_RIGHT) { position = maxCharacterLength - textLen; } else if (alignment == Element.ALIGN_CENTER) { position = (maxCharacterLength - textLen) / 2; } float step = (box.Width - extraMarginLeft) / maxCharacterLength; float start = step / 2 + position * step; if (textColor == null) { app.SetGrayFill(0); } else { app.SetColorFill(textColor); } app.BeginText(); foreach (Chunk ck in phrase) { BaseFont bf = ck.Font.BaseFont; app.SetFontAndSize(bf, usize); StringBuilder sb = ck.Append(""); for (int j = 0; j < sb.Length; ++j) { String c = sb.ToString(j, 1); float wd = bf.GetWidthPoint(c, usize); app.SetTextMatrix(extraMarginLeft + start - wd / 2, offsetY - extraMarginTop); app.ShowText(c); start += step; } } app.EndText(); } else { float x; switch (alignment) { case Element.ALIGN_RIGHT: x = extraMarginLeft + box.Width - (2 * offsetX); break; case Element.ALIGN_CENTER: x = extraMarginLeft + (box.Width / 2); break; default: x = extraMarginLeft + (2 * offsetX); break; } ColumnText.ShowTextAligned(app, alignment, phrase, x, offsetY - extraMarginTop, 0, rtl, 0); } } app.RestoreState(); app.EndVariableText(); return(app); }
private int FloatingLayout(List <IElement> floatingElements, bool simulate) { int status = ColumnText.NO_MORE_TEXT; float minYLine = yLine; float leftWidth = 0; float rightWidth = 0; ColumnText currentCompositeColumn = compositeColumn; if (simulate) { currentCompositeColumn = ColumnText.Duplicate(compositeColumn); } while (floatingElements.Count > 0) { IElement nextElement = floatingElements[0]; floatingElements.RemoveAt(0); if (nextElement is PdfDiv) { PdfDiv floatingElement = (PdfDiv)nextElement; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { floatingElements.Insert(0, floatingElement); break; } } if (floatingElement.Float == PdfDiv.FloatType.LEFT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatLeftX, minY, floatRightX, yLine); floatLeftX += floatingElement.getActualWidth(); leftWidth += floatingElement.getActualWidth(); } else if (floatingElement.Float == PdfDiv.FloatType.RIGHT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatRightX - floatingElement.getActualWidth() - 0.01f, minY, floatRightX, yLine); floatRightX -= floatingElement.getActualWidth(); rightWidth += floatingElement.getActualWidth(); } minYLine = Math.Min(minYLine, yLine - floatingElement.getActualHeight()); } else { if (nextElement is ISpaceable) { yLine -= ((ISpaceable)nextElement).SpacingBefore; } if (simulate) { if (nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } else { currentCompositeColumn.AddElement(nextElement); } } else { currentCompositeColumn.AddElement(nextElement); } if (yLine > minYLine) { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minYLine); } else { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); } currentCompositeColumn.FilledWidth = 0; status = currentCompositeColumn.Go(simulate); if (yLine > minYLine && (floatLeftX > leftX || floatRightX < rightX) && (status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } leftWidth = 0; rightWidth = 0; if (simulate && nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); status = currentCompositeColumn.Go(simulate); minYLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; yLine = minYLine; if (compositeColumn.FilledWidth > filledWidth) { filledWidth = compositeColumn.FilledWidth; } } else { if (rightWidth > 0) { rightWidth += currentCompositeColumn.FilledWidth; } else if (leftWidth > 0) { leftWidth += currentCompositeColumn.FilledWidth; } else if (currentCompositeColumn.FilledWidth > filledWidth) { filledWidth = currentCompositeColumn.FilledWidth; } minYLine = Math.Min(currentCompositeColumn.YLine + currentCompositeColumn.Descender, minYLine); yLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; } if ((status & ColumnText.NO_MORE_TEXT) == 0) { if (!simulate) { floatingElements.InsertRange(0, currentCompositeColumn.CompositeElements); currentCompositeColumn.CompositeElements.Clear(); } else { floatingElements.Insert(0, nextElement); currentCompositeColumn.SetText(null); } break; } else { currentCompositeColumn.SetText(null); } } } if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; return(status); }
/** * Get the <code>PdfAppearance</code> of a text or combo field * @throws IOException on error * @throws DocumentException on error * @return A <code>PdfAppearance</code> */ public PdfAppearance GetAppearance() { PdfAppearance app = GetBorderAppearance(); app.BeginVariableText(); if (text == null || text.Length == 0) { app.EndVariableText(); return app; } bool borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET; float h = box.Height - borderWidth * 2 - extraMarginTop; float bw2 = borderWidth; if (borderExtra) { h -= borderWidth * 2; bw2 *= 2; } float offsetX = Math.Max(bw2, 1); float offX = Math.Min(bw2, offsetX); app.SaveState(); app.Rectangle(offX, offX, box.Width - 2 * offX, box.Height - 2 * offX); app.Clip(); app.NewPath(); String ptext; if ((options & PASSWORD) != 0) ptext = ObfuscatePassword(text); else if ((options & MULTILINE) == 0) ptext = RemoveCRLF(text); else ptext = text; //fixed by Kazuya Ujihara (ujihara.jp) BaseFont ufont = RealFont; BaseColor fcolor = (textColor == null) ? GrayColor.GRAYBLACK : textColor; int rtl = CheckRTL(ptext) ? PdfWriter.RUN_DIRECTION_LTR : PdfWriter.RUN_DIRECTION_NO_BIDI; float usize = fontSize; Phrase phrase = ComposePhrase(ptext, ufont, fcolor, usize); if ((options & MULTILINE) != 0) { float width = box.Width - 4 * offsetX - extraMarginLeft; float factor = ufont.GetFontDescriptor(BaseFont.BBOXURY, 1) - ufont.GetFontDescriptor(BaseFont.BBOXLLY, 1); ColumnText ct = new ColumnText(null); if (usize == 0) { usize = h / factor; if (usize > 4) { if (usize > 12) usize = 12; float step = Math.Max((usize - 4) / 10, 0.2f); ct.SetSimpleColumn(0, -h, width, 0); ct.Alignment = alignment; ct.RunDirection = rtl; for (; usize > 4; usize -= step) { ct.YLine = 0; ChangeFontSize(phrase, usize); ct.SetText(phrase); ct.Leading = factor * usize; int status = ct.Go(true); if ((status & ColumnText.NO_MORE_COLUMN) == 0) break; } } if (usize < 4) { usize = 4; } } ChangeFontSize(phrase, usize); ct.Canvas = app; float leading = usize * factor; float offsetY = offsetX + h - ufont.GetFontDescriptor(BaseFont.BBOXURY, usize); ct.SetSimpleColumn(extraMarginLeft + 2 * offsetX, -20000, box.Width - 2 * offsetX, offsetY + leading); ct.Leading = leading; ct.Alignment = alignment; ct.RunDirection = rtl; ct.SetText(phrase); ct.Go(); } else { if (usize == 0) { float maxCalculatedSize = h / (ufont.GetFontDescriptor(BaseFont.BBOXURX, 1) - ufont.GetFontDescriptor(BaseFont.BBOXLLY, 1)); ChangeFontSize(phrase, 1); float wd = ColumnText.GetWidth(phrase, rtl, 0); if (wd == 0) usize = maxCalculatedSize; else usize = Math.Min(maxCalculatedSize, (box.Width - extraMarginLeft - 4 * offsetX) / wd); if (usize < 4) usize = 4; } ChangeFontSize(phrase, usize); float offsetY = offX + ((box.Height - 2*offX) - ufont.GetFontDescriptor(BaseFont.ASCENT, usize)) / 2; if (offsetY < offX) offsetY = offX; if (offsetY - offX < -ufont.GetFontDescriptor(BaseFont.DESCENT, usize)) { float ny = -ufont.GetFontDescriptor(BaseFont.DESCENT, usize) + offX; float dy = box.Height - offX - ufont.GetFontDescriptor(BaseFont.ASCENT, usize); offsetY = Math.Min(ny, Math.Max(offsetY, dy)); } if ((options & COMB) != 0 && maxCharacterLength > 0) { int textLen = Math.Min(maxCharacterLength, ptext.Length); int position = 0; if (alignment == Element.ALIGN_RIGHT) { position = maxCharacterLength - textLen; } else if (alignment == Element.ALIGN_CENTER) { position = (maxCharacterLength - textLen) / 2; } float step = (box.Width - extraMarginLeft) / maxCharacterLength; float start = step / 2 + position * step; if (textColor == null) app.SetGrayFill(0); else app.SetColorFill(textColor); app.BeginText(); foreach (Chunk ck in phrase) { BaseFont bf = ck.Font.BaseFont; app.SetFontAndSize(bf, usize); StringBuilder sb = ck.Append(""); for (int j = 0; j < sb.Length; ++j) { String c = sb.ToString(j, 1); float wd = bf.GetWidthPoint(c, usize); app.SetTextMatrix(extraMarginLeft + start - wd / 2, offsetY - extraMarginTop); app.ShowText(c); start += step; } } app.EndText(); } else { float x; switch (alignment) { case Element.ALIGN_RIGHT: x = extraMarginLeft + box.Width - (2 * offsetX); break; case Element.ALIGN_CENTER: x = extraMarginLeft + (box.Width / 2); break; default: x = extraMarginLeft + (2 * offsetX); break; } ColumnText.ShowTextAligned(app, alignment, phrase, x, offsetY - extraMarginTop, 0, rtl, 0); } } app.RestoreState(); app.EndVariableText(); return app; }
private void DrawOverlayText(PdfContentByte canvas, IList<Rectangle> textRectangles, PdfString overlayText, PdfString otDA, PdfNumber otQ, PdfBoolean otRepeat) { ColumnText ct = new ColumnText(canvas); ct.SetLeading(0, 1.2F); ct.UseAscender = true; String otStr = overlayText.ToUnicodeString(); canvas.SaveState(); IDictionary<string, IList<object>> parsedDA = ParseDAParam(otDA); Font font = null; if (parsedDA.ContainsKey(STROKE_COLOR)) { IList<object> strokeColorArgs = parsedDA[STROKE_COLOR]; SetStrokeColor(canvas, strokeColorArgs); } if (parsedDA.ContainsKey(FILL_COLOR)) { IList<object> fillColorArgs = parsedDA[FILL_COLOR]; SetFillColor(canvas, fillColorArgs); } if (parsedDA.ContainsKey("Tf")) { IList<object> tfArgs = parsedDA["Tf"]; font = RetrieveFontFromAcroForm((PdfName) tfArgs[0], (PdfNumber) tfArgs[1]); } foreach (Rectangle textRect in textRectangles) { ct.SetSimpleColumn(textRect); if (otQ != null) { ct.Alignment = otQ.IntValue; } Phrase otPhrase; if (font != null) { otPhrase = new Phrase(otStr, font); } else { otPhrase = new Phrase(otStr); } float y = ct.YLine; if (otRepeat != null && otRepeat.BooleanValue) { int status = ct.Go(true); while (!ColumnText.HasMoreText(status)) { otPhrase.Add(otStr); ct.SetText(otPhrase); ct.YLine = y; status = ct.Go(true); } } ct.SetText(otPhrase); ct.YLine = y; ct.Go(); } canvas.RestoreState(); }
private int FloatingLayout(List <IElement> floatingElements, bool simulate) { int status = ColumnText.NO_MORE_TEXT; float minYLine = yLine; float leftWidth = 0; float rightWidth = 0; ColumnText currentCompositeColumn = compositeColumn; if (simulate) { currentCompositeColumn = ColumnText.Duplicate(compositeColumn); } bool ignoreSpacingBefore = maxY == yLine; while (floatingElements.Count > 0) { IElement nextElement = floatingElements[0]; floatingElements.RemoveAt(0); if (nextElement is PdfDiv) { PdfDiv floatingElement = (PdfDiv)nextElement; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { floatingElements.Insert(0, floatingElement); break; } } if (floatingElement.Float == PdfDiv.FloatType.LEFT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatLeftX, minY, floatRightX, yLine); floatLeftX += floatingElement.getActualWidth(); leftWidth += floatingElement.getActualWidth(); } else if (floatingElement.Float == PdfDiv.FloatType.RIGHT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatRightX - floatingElement.getActualWidth() - 0.01f, minY, floatRightX, yLine); floatRightX -= floatingElement.getActualWidth(); rightWidth += floatingElement.getActualWidth(); } minYLine = Math.Min(minYLine, yLine - floatingElement.getActualHeight()); } else { if (minY > minYLine) { status = ColumnText.NO_MORE_COLUMN; floatingElements.Insert(0, nextElement); if (currentCompositeColumn != null) { currentCompositeColumn.SetText(null); } break; } else { if (nextElement is ISpaceable && (!ignoreSpacingBefore || !currentCompositeColumn.IgnoreSpacingBefore || ((ISpaceable)nextElement).PaddingTop != 0)) { yLine -= ((ISpaceable)nextElement).SpacingBefore; } if (simulate) { if (nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } else { currentCompositeColumn.AddElement(nextElement); } } else { currentCompositeColumn.AddElement(nextElement); } if (yLine > minYLine) { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minYLine); } else { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); } currentCompositeColumn.FilledWidth = 0; status = currentCompositeColumn.Go(simulate); if (yLine > minYLine && (floatLeftX > leftX || floatRightX < rightX) && (status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } leftWidth = 0; rightWidth = 0; if (simulate && nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); status = currentCompositeColumn.Go(simulate); minYLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; yLine = minYLine; if (currentCompositeColumn.FilledWidth > filledWidth) { filledWidth = currentCompositeColumn.FilledWidth; } } else { if (rightWidth > 0) { rightWidth += currentCompositeColumn.FilledWidth; } else if (leftWidth > 0) { leftWidth += currentCompositeColumn.FilledWidth; } else if (currentCompositeColumn.FilledWidth > filledWidth) { filledWidth = currentCompositeColumn.FilledWidth; } minYLine = Math.Min(currentCompositeColumn.YLine + currentCompositeColumn.Descender, minYLine); yLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; } if ((status & ColumnText.NO_MORE_TEXT) == 0) { if (!simulate) { floatingElements.InsertRange(0, currentCompositeColumn.CompositeElements); currentCompositeColumn.CompositeElements.Clear(); } else { floatingElements.Insert(0, nextElement); currentCompositeColumn.SetText(null); } break; } else { currentCompositeColumn.SetText(null); } } } if (nextElement is Paragraph) { Paragraph p = (Paragraph)nextElement; foreach (IElement e in p) { if (e is WritableDirectElement) { WritableDirectElement writableElement = (WritableDirectElement)e; if (writableElement.DirectElemenType == WritableDirectElement.DIRECT_ELEMENT_TYPE_HEADER && !simulate) { PdfWriter writer = compositeColumn.Canvas.PdfWriter; PdfDocument doc = compositeColumn.Canvas.PdfDocument; // here is used a little hack: // writableElement.write() method implementation uses PdfWriter.getVerticalPosition() to create PdfDestination (see com.itextpdf.tool.xml.html.Header), // so here we are adjusting document's currentHeight in order to make getVerticalPosition() return value corresponding to real current position float savedHeight = doc.currentHeight; doc.currentHeight = doc.Top - yLine - doc.indentation.indentTop; writableElement.Write(writer, doc); doc.currentHeight = savedHeight; } } } } if (ignoreSpacingBefore && nextElement.Chunks.Count == 0) { if (nextElement is Paragraph) { Paragraph p = (Paragraph)nextElement; IElement e = p[0]; if (e is WritableDirectElement) { WritableDirectElement writableDirectElement = (WritableDirectElement)e; if (writableDirectElement.DirectElemenType != WritableDirectElement.DIRECT_ELEMENT_TYPE_HEADER) { ignoreSpacingBefore = false; } } } else if (nextElement is ISpaceable) { ignoreSpacingBefore = false; } } else { ignoreSpacingBefore = false; } } if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; return(status); }
private int FloatingLayout(List <IElement> floatingElements, bool simulate) { int status = ColumnText.NO_MORE_TEXT; float minYLine = yLine; float leftWidth = 0; float rightWidth = 0; ColumnText currentCompositeColumn = compositeColumn; if (simulate) { currentCompositeColumn = ColumnText.Duplicate(compositeColumn); } bool ignoreSpacingBefore = maxY == yLine; while (floatingElements.Count > 0) { IElement nextElement = floatingElements[0]; floatingElements.RemoveAt(0); if (nextElement is PdfDiv) { PdfDiv floatingElement = (PdfDiv)nextElement; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; status = floatingElement.Layout(compositeColumn.Canvas, useAscender, true, floatLeftX, minY, floatRightX, yLine); if ((status & ColumnText.NO_MORE_TEXT) == 0) { floatingElements.Insert(0, floatingElement); break; } } if (floatingElement.Float == PdfDiv.FloatType.LEFT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatLeftX, minY, floatRightX, yLine); floatLeftX += floatingElement.getActualWidth(); leftWidth += floatingElement.getActualWidth(); } else if (floatingElement.Float == PdfDiv.FloatType.RIGHT) { status = floatingElement.Layout(compositeColumn.Canvas, useAscender, simulate, floatRightX - floatingElement.getActualWidth() - 0.01f, minY, floatRightX, yLine); floatRightX -= floatingElement.getActualWidth(); rightWidth += floatingElement.getActualWidth(); } minYLine = Math.Min(minYLine, yLine - floatingElement.getActualHeight()); } else { if (minY > minYLine) { status = ColumnText.NO_MORE_COLUMN; floatingElements.Insert(0, nextElement); if (currentCompositeColumn != null) { currentCompositeColumn.SetText(null); } break; } else { if (nextElement is ISpaceable && (!ignoreSpacingBefore || !currentCompositeColumn.IgnoreSpacingBefore || ((ISpaceable)nextElement).PaddingTop != 0)) { yLine -= ((ISpaceable)nextElement).SpacingBefore; } if (simulate) { if (nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } else { currentCompositeColumn.AddElement(nextElement); } } else { currentCompositeColumn.AddElement(nextElement); } if (yLine > minYLine) { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minYLine); } else { currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); } currentCompositeColumn.FilledWidth = 0; status = currentCompositeColumn.Go(simulate); if (yLine > minYLine && (floatLeftX > leftX || floatRightX < rightX) && (status & ColumnText.NO_MORE_TEXT) == 0) { yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } leftWidth = 0; rightWidth = 0; if (simulate && nextElement is PdfPTable) { currentCompositeColumn.AddElement(new PdfPTable((PdfPTable)nextElement)); } currentCompositeColumn.SetSimpleColumn(floatLeftX, yLine, floatRightX, minY); status = currentCompositeColumn.Go(simulate); minYLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; yLine = minYLine; if (currentCompositeColumn.FilledWidth > filledWidth) { filledWidth = currentCompositeColumn.FilledWidth; } } else { if (rightWidth > 0) { rightWidth += currentCompositeColumn.FilledWidth; } else if (leftWidth > 0) { leftWidth += currentCompositeColumn.FilledWidth; } else if (currentCompositeColumn.FilledWidth > filledWidth) { filledWidth = currentCompositeColumn.FilledWidth; } minYLine = Math.Min(currentCompositeColumn.YLine + currentCompositeColumn.Descender, minYLine); yLine = currentCompositeColumn.YLine + currentCompositeColumn.Descender; } if ((status & ColumnText.NO_MORE_TEXT) == 0) { if (!simulate) { floatingElements.InsertRange(0, currentCompositeColumn.CompositeElements); currentCompositeColumn.CompositeElements.Clear(); } else { floatingElements.Insert(0, nextElement); currentCompositeColumn.SetText(null); } break; } else { currentCompositeColumn.SetText(null); } } } if (ignoreSpacingBefore && nextElement.Chunks.Count == 0) { if (nextElement is Paragraph) { Paragraph p = (Paragraph)nextElement; IElement e = p[0]; if (e is WritableDirectElement) { WritableDirectElement writableDirectElement = (WritableDirectElement)e; if (writableDirectElement.DirectElemenType != WritableDirectElement.DIRECT_ELEMENT_TYPE_HEADER) { ignoreSpacingBefore = false; } } } else if (nextElement is ISpaceable) { ignoreSpacingBefore = false; } } else { ignoreSpacingBefore = false; } } if (leftWidth != 0 && rightWidth != 0) { filledWidth = rightX - leftX; } else { if (leftWidth > filledWidth) { filledWidth = leftWidth; } if (rightWidth > filledWidth) { filledWidth = rightWidth; } } yLine = minYLine; floatLeftX = leftX; floatRightX = rightX; return(status); }