/* (non-Javadoc) * @see com.itextpdf.layout.renderer.TextRenderer#layout(com.itextpdf.layout.layout.LayoutContext) */ public override LayoutResult Layout(LayoutContext layoutContext) { PageCountType pageCountType = (PageCountType)this.GetProperty <PageCountType?>(Html2PdfProperty.PAGE_COUNT_TYPE ); if (pageCountType == PageCountType.CURRENT_PAGE_NUMBER) { SetText(layoutContext.GetArea().GetPageNumber().ToString()); } else { if (pageCountType == PageCountType.TOTAL_PAGE_COUNT) { IRenderer rootRenderer = this; while (rootRenderer is AbstractRenderer && ((AbstractRenderer)rootRenderer).GetParent() != null) { rootRenderer = ((AbstractRenderer)rootRenderer).GetParent(); } if (rootRenderer is HtmlDocumentRenderer && ((HtmlDocumentRenderer)rootRenderer).GetEstimatedNumberOfPages () > 0) { SetText(((HtmlDocumentRenderer)rootRenderer).GetEstimatedNumberOfPages().ToString()); } else { if (rootRenderer is DocumentRenderer && rootRenderer.GetModelElement() is Document) { SetText(((Document)rootRenderer.GetModelElement()).GetPdfDocument().GetNumberOfPages().ToString()); } } } } return(base.Layout(layoutContext)); }
/* (non-Javadoc) * @see com.itextpdf.layout.renderer.TextRenderer#layout(com.itextpdf.layout.layout.LayoutContext) */ public override LayoutResult Layout(LayoutContext layoutContext) { PageCountType pageCountType = (PageCountType)this.GetProperty <PageCountType?>(Html2PdfProperty.PAGE_COUNT_TYPE ); String previousText = GetText().ToString(); // If typography is enabled and the page counter element has a non-default direction, // iText processes its content (see LineRenderer#updateBidiLevels) before layouting it. // This might result in an ArrayIndexOutOfBounds exception, because currently iText updates the page counter's content on layout. // To solve this, this workaround has been implemented: the renderer's strToBeConverted shouldn't be updated by layout. bool textHasBeenReplaced = false; if (pageCountType == PageCountType.CURRENT_PAGE_NUMBER) { SetText(HtmlUtils.ConvertNumberAccordingToGlyphStyle(digitsGlyphStyle, layoutContext.GetArea().GetPageNumber ())); textHasBeenReplaced = true; } else { if (pageCountType == PageCountType.TOTAL_PAGE_COUNT) { IRenderer rootRenderer = this; while (rootRenderer is AbstractRenderer && ((AbstractRenderer)rootRenderer).GetParent() != null) { rootRenderer = ((AbstractRenderer)rootRenderer).GetParent(); } if (rootRenderer is HtmlDocumentRenderer && ((HtmlDocumentRenderer)rootRenderer).GetEstimatedNumberOfPages () > 0) { SetText(HtmlUtils.ConvertNumberAccordingToGlyphStyle(digitsGlyphStyle, ((HtmlDocumentRenderer)rootRenderer ).GetEstimatedNumberOfPages())); textHasBeenReplaced = true; } else { if (rootRenderer is DocumentRenderer && rootRenderer.GetModelElement() is Document) { SetText(HtmlUtils.ConvertNumberAccordingToGlyphStyle(digitsGlyphStyle, ((Document)rootRenderer.GetModelElement ()).GetPdfDocument().GetNumberOfPages())); textHasBeenReplaced = true; } } } } LayoutResult result = base.Layout(layoutContext); if (textHasBeenReplaced) { SetText(previousText); } return(result); }