/// <summary> /// Creates a fitting renderer for the given document object for formatting. /// </summary> /// <param name="gfx">The XGraphics object to do measurements on.</param> /// <param name="documentRenderer">The document renderer.</param> /// <param name="documentObject">the document object to format.</param> /// <param name="fieldInfos">The field infos.</param> /// <returns>The fitting Renderer.</returns> internal static Renderer Create(XGraphics gfx, DocumentRenderer documentRenderer, DocumentObject documentObject, FieldInfos fieldInfos) { Renderer renderer = null; if (documentObject is Paragraph) { renderer = new ParagraphRenderer(gfx, (Paragraph)documentObject, fieldInfos); } else if (documentObject is Table) { renderer = new TableRenderer(gfx, (Table)documentObject, fieldInfos); } else if (documentObject is PageBreak) { renderer = new PageBreakRenderer(gfx, (PageBreak)documentObject, fieldInfos); } else if (documentObject is TextFrame) { renderer = new TextFrameRenderer(gfx, (TextFrame)documentObject, fieldInfos); } else if (documentObject is Image) { renderer = new ImageRenderer(gfx, (Image)documentObject, fieldInfos); } if (renderer != null) { renderer._documentRenderer = documentRenderer; } return(renderer); }
/// <summary> /// Creates a fitting renderer for the render info to render and layout with. /// </summary> /// <param name="gfx">The XGraphics object to render on.</param> /// <param name="documentRenderer">The document renderer.</param> /// <param name="renderInfo">The RenderInfo object stored after a previous call of Format().</param> /// <param name="fieldInfos">The field infos.</param> /// <returns>The fitting Renderer.</returns> internal static Renderer Create(XGraphics gfx, DocumentRenderer documentRenderer, RenderInfo renderInfo, FieldInfos fieldInfos) { Renderer renderer = null; if (renderInfo.DocumentObject is Paragraph) { renderer = new ParagraphRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is Table) { renderer = new TableRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is PageBreak) { renderer = new PageBreakRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is TextFrame) { renderer = new TextFrameRenderer(gfx, renderInfo, fieldInfos); } //else if (renderInfo.DocumentObject is Chart) // renderer = new ChartRenderer(gfx, renderInfo, fieldInfos); else if (renderInfo.DocumentObject is Image) { renderer = new ImageRenderer(gfx, renderInfo, fieldInfos); } if (renderer != null) { renderer._documentRenderer = documentRenderer; } return(renderer); }
/// <summary>Updates the font.</summary> /// <param name="renderer">the renderer</param> internal virtual void UpdatePdfFont(ParagraphRenderer renderer) { Object retrievedFont; if (renderer != null) { IList <LineRenderer> lines = renderer.GetLines(); if (lines != null) { foreach (LineRenderer line in lines) { foreach (IRenderer child in line.GetChildRenderers()) { retrievedFont = child.GetProperty <Object>(Property.FONT); if (retrievedFont is PdfFont) { font = (PdfFont)retrievedFont; return; } } } } retrievedFont = renderer.GetProperty <Object>(Property.FONT); if (retrievedFont is PdfFont) { font = (PdfFont)retrievedFont; } } }
/// <summary> /// Calculates font size according to given bbox height, width and selected /// font. /// </summary> /// <param name="document"> /// PDF document as a /// <see cref="iText.Layout.Document"/> /// object /// </param> /// <param name="line">text line</param> /// <param name="fontFamily">default font family</param> /// <param name="bboxHeightPt">height of bbox calculated by OCR Reader</param> /// <param name="bboxWidthPt">width of bbox calculated by OCR Reader</param> /// <returns>font size</returns> internal static float CalculateFontSize(Document document, String line, String fontFamily, float bboxHeightPt , float bboxWidthPt) { Rectangle bbox = new Rectangle(bboxWidthPt * 1.5f, bboxHeightPt * 1.5f); // setting minimum and maximum (approx.) values for font size float fontSize = 1; float maxFontSize = bbox.GetHeight(); try { Paragraph paragraph = new Paragraph(line); paragraph.SetWidth(bbox.GetWidth()); paragraph.SetFontFamily(fontFamily); while (Math.Abs(fontSize - maxFontSize) > 1e-1) { float curFontSize = (fontSize + maxFontSize) / 2; paragraph.SetFontSize(curFontSize); ParagraphRenderer renderer = (ParagraphRenderer)paragraph.CreateRendererSubTree().SetParent(document.GetRenderer ()); LayoutContext context = new LayoutContext(new LayoutArea(1, bbox)); if (renderer.Layout(context).GetStatus() == LayoutResult.FULL && renderer.GetLines().Count == 1) { fontSize = curFontSize; } else { maxFontSize = curFontSize; } } } catch (InvalidOperationException e) { LOGGER.Error(PdfOcrLogMessageConstant.PROVIDED_FONT_PROVIDER_IS_INVALID); throw new OcrException(OcrException.CANNOT_RESOLVE_PROVIDED_FONTS, e); } return(fontSize); }
protected void ManipulatePdf(string dest) { PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest)); Document doc = new Document(pdfDoc); PdfCanvas canvas = new PdfCanvas(pdfDoc.GetFirstPage()); Paragraph p = new Paragraph("This is a long paragraph that doesn't" + "fit the width we defined for the simple column of the" + "ColumnText object, so it will be distributed over several" + "lines (and we don't know in advance how many)."); Rectangle firstRect = new Rectangle(120, 500, 130, 280); new Canvas(canvas, firstRect) .Add(p); canvas.Rectangle(firstRect); canvas.Stroke(); // In the lines below the comment we try to reproduce the iText5 method to achieve the result // However it's much more simple to use the next line // p.SetBorder(new SolidBorder(1)); // Or you can implement your own ParagraphRenderer and change the behaviour of drawBorder(DrawContext) // or draw(DrawContext) Rectangle secRect = new Rectangle(300, 500, 130, 280); ParagraphRenderer renderer = (ParagraphRenderer)p.CreateRendererSubTree().SetParent(doc.GetRenderer()); float height = renderer.Layout(new LayoutContext(new LayoutArea(0, secRect))) .GetOccupiedArea().GetBBox().GetHeight(); new Canvas(canvas, secRect) .Add(p); canvas.Rectangle(secRect.GetX(), secRect.GetY() + secRect.GetHeight() - height, secRect.GetWidth(), height); canvas.Stroke(); doc.Close(); }
public virtual void OrphansWidowsAwareAndDirectLayoutProduceSameResult() { PdfDocument pdfDocument = new PdfDocument(new PdfWriter(new MemoryStream())); Document document = new Document(pdfDocument); int minAllowedWidows = 3; int overflowedToNextPageLinesNum = 5; Paragraph widowsParagraph = new Paragraph(OrphansWidowsTestUtil.PARA_TEXT); IRenderer paragraphRenderer = widowsParagraph.CreateRendererSubTree().SetParent(document.GetRenderer()); Rectangle effectiveArea = document.GetPageEffectiveArea(pdfDocument.GetDefaultPageSize()); float linesHeight = OrphansWidowsTestUtil.CalculateHeightForLinesNum(document, widowsParagraph, effectiveArea .GetWidth(), overflowedToNextPageLinesNum, false); Rectangle layoutAreaRect = new Rectangle(effectiveArea).SetHeight(linesHeight + OrphansWidowsTestUtil.LINES_SPACE_EPS ); LayoutContext layoutContext = new LayoutContext(new LayoutArea(1, layoutAreaRect)); LayoutResult noWidowsControlLayoutResult = paragraphRenderer.Layout(layoutContext); ParagraphWidowsControl widowsControl = new ParagraphWidowsControl(minAllowedWidows, 1, false); widowsParagraph.SetWidowsControl(widowsControl); LayoutResult widowsControlLayoutResult = paragraphRenderer.Layout(layoutContext); // toString() comparison is used since it contains report on status, areaBreak and occupiedArea NUnit.Framework.Assert.AreEqual(noWidowsControlLayoutResult.ToString(), widowsControlLayoutResult.ToString ()); ParagraphRenderer firstSplitRenderer = (ParagraphRenderer)noWidowsControlLayoutResult.GetSplitRenderer(); ParagraphRenderer secondSplitRenderer = (ParagraphRenderer)widowsControlLayoutResult.GetSplitRenderer(); NUnit.Framework.Assert.IsNotNull(firstSplitRenderer); NUnit.Framework.Assert.IsNotNull(secondSplitRenderer); NUnit.Framework.Assert.AreEqual(firstSplitRenderer.ToString(), secondSplitRenderer.ToString()); NUnit.Framework.Assert.IsNotNull(noWidowsControlLayoutResult.GetOverflowRenderer()); NUnit.Framework.Assert.IsNotNull(widowsControlLayoutResult.GetOverflowRenderer()); }
private XUnit CalcContentHeight(DocumentRenderer documentRenderer) { XUnit height = RenderInfo.GetTotalHeight(GetRenderInfos()); if (height == 0) { height = ParagraphRenderer.GetLineHeight(_cell.Format, _gfx, documentRenderer); height += _cell.Format.SpaceBefore; height += _cell.Format.SpaceAfter; } return(height); }
public static float CalculateHeightForLinesNumKeepTogetherCaseSpecific(Document doc, Paragraph p, float width , float height, float linesNum) { ParagraphRenderer renderer = (ParagraphRenderer)p.CreateRendererSubTree().SetParent(doc.GetRenderer()); LayoutResult layoutRes = renderer.Layout(new LayoutContext(new LayoutArea(1, new Rectangle(width, 10000))) ); int allLinesCount = renderer.GetLines().Count; float lineHeight = layoutRes.GetOccupiedArea().GetBBox().GetHeight() / allLinesCount; renderer.Layout(new LayoutContext(new LayoutArea(1, new Rectangle(width, height)))); int linesWithinOnePageCount = renderer.GetLines().Count; return((allLinesCount - linesWithinOnePageCount - linesNum) * lineHeight); }
public static void ProduceOrphansAndWidowsTestCase(String outPdf, Paragraph testPara) { Document doc = new Document(new PdfDocument(new PdfWriter(outPdf))); PageSize pageSize = new PageSize(PageSize.A4.GetWidth(), PageSize.A5.GetHeight()); doc.GetPdfDocument().SetDefaultPageSize(pageSize); Rectangle[] columns = InitUniformColumns(pageSize, 2); doc.SetRenderer(new ColumnDocumentRenderer(doc, columns)); String paraText = "A one line string\n"; testPara.SetMargin(0).SetBackgroundColor(new DeviceRgb(232, 232, 232)); testPara.Add(paraText); float linesHeight = CalculateHeightForLinesNum(doc, testPara, columns[1].GetWidth(), 1, true); float adjustmentHeight = columns[0].GetHeight() - linesHeight - LINES_SPACE_EPS; String description = "Test orphans and widows case at once. This block height" + " is adjusted in such way that both orphans and widows cases occur.\n " + "The following paragraph contains as many fitting in one line text strings as needed" + " to reproduce the case with both orphans and widows\n" + "Reference example without orphans and widows" + " control can be found on the next page"; doc.Add(new Paragraph(description).SetMargin(0).SetBorder(new SolidBorder(1)).SetHeight(adjustmentHeight)); Paragraph tempPara = new Paragraph().SetMargin(0); for (int i = 0; i < 50; i++) { tempPara.Add(paraText); } ParagraphRenderer renderer = (ParagraphRenderer)tempPara.CreateRendererSubTree().SetParent(doc.GetRenderer ()); LayoutResult layoutRes = renderer.Layout(new LayoutContext(new LayoutArea(1, new Rectangle(columns[1].GetWidth (), columns[1].GetHeight())))); int numberOfLines = ((ParagraphRenderer)layoutRes.GetSplitRenderer()).GetLines().Count; for (int i = 0; i <= numberOfLines; i++) { testPara.Add(paraText); } doc.Add(testPara); doc.Add(new AreaBreak(AreaBreakType.NEXT_PAGE)); doc.Add(new Paragraph("Reference example without orphans and widows control.").SetMargin(0).SetBorder(new SolidBorder(1)).SetHeight(adjustmentHeight)); Paragraph paragraph = new Paragraph(); for (int i = 0; i <= numberOfLines + 1; i++) { paragraph.Add(paraText); } paragraph.SetMargin(0).SetBackgroundColor(new DeviceRgb(232, 232, 232)); doc.Add(paragraph); doc.Add(new Paragraph(paraText).SetMargin(0).SetBackgroundColor(new DeviceRgb(232, 232, 232))); doc.Close(); }
private static void AddSection(PdfDocument pdfDoc, Paragraph paragraph, int pageNumber, int sectionNumber) { Document doc = new Document(pdfDoc); ParagraphRenderer renderer = (ParagraphRenderer)paragraph.CreateRendererSubTree(); renderer.SetParent(new DocumentRenderer(doc)); float pageHeight = pdfDoc.GetDefaultPageSize().GetHeight(); float pageWidth = pdfDoc.GetDefaultPageSize().GetWidth(); Rectangle textSectionRectangle = new Rectangle( doc.GetLeftMargin(), doc.GetBottomMargin() + ((pageHeight - doc.GetTopMargin() - doc.GetBottomMargin()) / 3) * sectionNumber, pageWidth - doc.GetLeftMargin() - doc.GetRightMargin(), (pageHeight - doc.GetTopMargin() - doc.GetBottomMargin()) / 3); // Simulate the positioning of the renderer to find out how much space the text section will occupy. LayoutResult layoutResult = renderer .Layout(new LayoutContext(new LayoutArea(pageNumber, textSectionRectangle))); /* Fill the current page section with the content. * If the content isn't fully placed in the current page section, * it will be split and drawn in the next page section. */ while (layoutResult.GetStatus() != LayoutResult.FULL) { if (pdfDoc.GetNumberOfPages() < pageNumber) { pdfDoc.AddNewPage(); } pageNumber++; layoutResult.GetSplitRenderer().Draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.GetPage(pageNumber - 1)), false)); renderer = (ParagraphRenderer)layoutResult.GetOverflowRenderer(); layoutResult = renderer .Layout(new LayoutContext(new LayoutArea(pageNumber, textSectionRectangle))); } if (pdfDoc.GetNumberOfPages() < pageNumber) { pdfDoc.AddNewPage(); } renderer.Draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.GetPage(pageNumber)), false)); }
/// <summary>Writes a log message reporting that orphans constraint is violated.</summary> /// <remarks> /// Writes a log message reporting that orphans constraint is violated. /// This method is to be overridden if violation scenarios need to be handled in some other way. /// </remarks> /// <param name="renderer">a renderer processing orphans</param> /// <param name="message"> /// /// <see cref="System.String"/> /// explaining the reason for violation /// </param> public virtual void HandleViolatedOrphans(ParagraphRenderer renderer, String message) { ILog logger = LogManager.GetLogger(typeof(iText.Layout.Properties.ParagraphOrphansControl)); if (renderer.GetOccupiedArea() != null && renderer.GetLines() != null) { int pageNumber = renderer.GetOccupiedArea().GetPageNumber(); String warnText = MessageFormatUtil.Format(iText.IO.LogMessageConstant.ORPHANS_CONSTRAINT_VIOLATED, pageNumber , minOrphans, renderer.GetLines().Count, message); logger.Warn(warnText); } else { logger.Warn(iText.IO.LogMessageConstant.PREMATURE_CALL_OF_HANDLE_VIOLATION_METHOD); } }
/// <summary> /// Creates a fitting renderer for the render info to render and layout with. /// </summary> /// <param name="gfx">The XGraphics object to render on.</param> /// <param name="documentRenderer">The document renderer.</param> /// <param name="renderInfo">The RenderInfo object stored after a previous call of Format().</param> /// <param name="fieldInfos">The field infos.</param> /// <returns>The fitting Renderer.</returns> public static Renderer Create(XGraphics gfx, DocumentRenderer documentRenderer, RenderInfo renderInfo, FieldInfos fieldInfos) { Renderer renderer = null; if (renderInfo.DocumentObject is Paragraph) { renderer = new ParagraphRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is Table) { renderer = new TableRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is PageBreak) { renderer = new PageBreakRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is TextFrame) { renderer = new TextFrameRenderer(gfx, renderInfo, fieldInfos); } else if (renderInfo.DocumentObject is Chart) { renderer = new ChartRenderer(gfx, renderInfo, fieldInfos); } //else if (renderInfo.DocumentObject is Chart) // renderer = new ChartRenderer(gfx, renderInfo, fieldInfos); else if (renderInfo.DocumentObject is Image) { renderer = new ImageRenderer(gfx, renderInfo, fieldInfos); } else if (GetRendererType != null) { System.Type rendererType = GetRendererType(renderInfo.DocumentObject); if (rendererType != null) { renderer = (Renderer)System.Activator.CreateInstance(rendererType, gfx, renderInfo, fieldInfos); } } if (renderer != null) { renderer._documentRenderer = documentRenderer; } return(renderer); }
public static float CalculateHeightForLinesNum(Document doc, Paragraph p, float width, float linesNum, bool orphans) { ParagraphRenderer renderer = (ParagraphRenderer)p.CreateRendererSubTree().SetParent(doc.GetRenderer()); LayoutResult layoutRes = renderer.Layout(new LayoutContext(new LayoutArea(1, new Rectangle(width, 100000)) )); float lineHeight = layoutRes.GetOccupiedArea().GetBBox().GetHeight() / renderer.GetLines().Count; float height = lineHeight * linesNum; if (orphans) { return(height); } else { return(layoutRes.GetOccupiedArea().GetBBox().GetHeight() - height); } }
/// <summary> /// Creates a fitting renderer for the given document object for formatting. /// </summary> /// <param name="gfx">The XGraphics object to do measurements on.</param> /// <param name="documentRenderer">The document renderer.</param> /// <param name="documentObject">the document object to format.</param> /// <param name="fieldInfos">The field infos.</param> /// <returns>The fitting Renderer.</returns> internal static Renderer Create(XGraphics gfx, DocumentRenderer documentRenderer, DocumentObject documentObject, FieldInfos fieldInfos) { Renderer renderer = null; if (documentObject is Paragraph paragraph) { renderer = new ParagraphRenderer(gfx, paragraph, fieldInfos); } else if (documentObject is Table table) { renderer = new TableRenderer(gfx, table, fieldInfos); } else if (documentObject is PageBreak pageBreak) { renderer = new PageBreakRenderer(gfx, pageBreak, fieldInfos); } else if (documentObject is TextFrame textFrame) { renderer = new TextFrameRenderer(gfx, textFrame, fieldInfos); } else if (documentObject is Chart chart) { renderer = new ChartRenderer(gfx, chart, fieldInfos); } else if (documentObject is Image image) { if (_xpsCheck.IsMatch(image.Name)) { renderer = new XpsRenderer(gfx, image, fieldInfos, documentRenderer.XpsCache); } else { renderer = new ImageRenderer(gfx, image, fieldInfos); } } if (renderer != null) { renderer._documentRenderer = documentRenderer; } return(renderer); }
public SafeOrderedListRenderer(ParagraphRenderer para) { this.ParagraphRenderer = para; }