Class TextRenderer

java.lang.Object
com.itextpdf.layout.renderer.AbstractRenderer
com.itextpdf.layout.renderer.TextRenderer
All Implemented Interfaces:
IPropertyContainer, ILeafElementRenderer, IRenderer
Direct Known Subclasses:
FormFieldValueNonTrimmingTextRenderer, LinkRenderer, ListRenderer.ConstantFontTextRenderer

public class TextRenderer extends AbstractRenderer implements ILeafElementRenderer
This class represents the renderer object for a Text object. It will draw the glyphs of the textual content on the DrawContext.
  • Field Details

    • TEXT_SPACE_COEFF

      protected static final float TEXT_SPACE_COEFF
      See Also:
    • TYPO_ASCENDER_SCALE_COEFF

      static final float TYPO_ASCENDER_SCALE_COEFF
      See Also:
    • UNDEFINED_FIRST_CHAR_TO_FORCE_OVERFLOW

      static final int UNDEFINED_FIRST_CHAR_TO_FORCE_OVERFLOW
      See Also:
    • ITALIC_ANGLE

      private static final float ITALIC_ANGLE
      See Also:
    • BOLD_SIMULATION_STROKE_COEFF

      private static final float BOLD_SIMULATION_STROKE_COEFF
      See Also:
    • yLineOffset

      protected float yLineOffset
    • font

      private PdfFont font
    • text

      protected GlyphLine text
    • line

      protected GlyphLine line
    • strToBeConverted

      protected String strToBeConverted
    • otfFeaturesApplied

      protected boolean otfFeaturesApplied
    • tabAnchorCharacterPosition

      protected float tabAnchorCharacterPosition
    • reversedRanges

      protected List<int[]> reversedRanges
    • savedWordBreakAtLineEnding

      protected GlyphLine savedWordBreakAtLineEnding
    • specialScriptsWordBreakPoints

      private List<Integer> specialScriptsWordBreakPoints
    • specialScriptFirstNotFittingIndex

      private int specialScriptFirstNotFittingIndex
    • indexOfFirstCharacterToBeForcedToOverflow

      private int indexOfFirstCharacterToBeForcedToOverflow
  • Constructor Details

    • TextRenderer

      public TextRenderer(Text textElement)
      Creates a TextRenderer from its corresponding layout object.
      Parameters:
      textElement - the Text which this object should manage
    • TextRenderer

      public TextRenderer(Text textElement, String text)
      Creates a TextRenderer from its corresponding layout object, with a custom text to replace the contents of the Text.
      Parameters:
      textElement - the Text which this object should manage
      text - the replacement text
    • TextRenderer

      protected TextRenderer(TextRenderer other)
  • Method Details

    • layout

      public LayoutResult layout(LayoutContext layoutContext)
      Description copied from interface: IRenderer
      This method simulates positioning of the renderer, including all of its children, and returns the LayoutResult, representing the layout result, including occupied area, status, i.e. if there was enough place to fit the renderer subtree, etc. LayoutResult can be extended to return custom layout results for custom elements, e.g. TextRenderer uses TextLayoutResult as its result. This method can be called standalone to learn how much area the renderer subtree needs, or can be called before IRenderer.draw(DrawContext), to prepare the renderer to be flushed to the output stream.
      Specified by:
      layout in interface IRenderer
      Parameters:
      layoutContext - the description of layout area and any other additional information
      Returns:
      result of the layout process
    • increaseYLineOffset

      private void increaseYLineOffset(UnitValue[] paddings, Border[] borders, UnitValue[] margins)
    • applyOtf

      public void applyOtf()
    • draw

      public void draw(DrawContext drawContext)
      Description copied from class: AbstractRenderer
      Flushes the renderer subtree contents, i.e. draws itself on canvas, adds necessary objects to the PdfDocument etc.
      Specified by:
      draw in interface IRenderer
      Overrides:
      draw in class AbstractRenderer
      Parameters:
      drawContext - contains the PdfDocument to which the renderer subtree if flushed, the PdfCanvas on which the renderer subtree is drawn and other additional parameters needed to perform drawing
    • trimFirst

      public void trimFirst()
      Trims any whitespace characters from the start of the GlyphLine to be rendered.
    • trimLast

      float trimLast()
    • getAscent

      public float getAscent()
      Gets the maximum offset above the base line that this Text extends to.
      Specified by:
      getAscent in interface ILeafElementRenderer
      Returns:
      the upwards vertical offset of this Text
    • getDescent

      public float getDescent()
      Gets the maximum offset below the base line that this Text extends to.
      Specified by:
      getDescent in interface ILeafElementRenderer
      Returns:
      the downwards vertical offset of this Text
    • getYLine

      public float getYLine()
      Gets the position on the canvas of the imaginary horizontal line upon which the Text's contents will be written.
      Returns:
      the y position of this text on the DrawContext
    • moveYLineTo

      public void moveYLineTo(float y)
      Moves the vertical position to the parameter's value.
      Parameters:
      y - the new vertical position of the Text
    • setText

      public void setText(String text)
      Manually sets the contents of the Text's representation on the canvas, regardless of the Text's own contents.
      Parameters:
      text - the replacement text
    • setText

      public void setText(GlyphLine text, PdfFont font)
      Manually set a GlyphLine and PdfFont for rendering.
      Parameters:
      text - the GlyphLine
      font - the font
    • getText

      public GlyphLine getText()
    • length

      public int length()
      The length of the whole text assigned to this renderer.
      Returns:
      the text length
    • toString

      public String toString()
      Description copied from class: AbstractRenderer
      Returns a string representation of the renderer.
      Overrides:
      toString in class AbstractRenderer
      Returns:
      a String
      See Also:
    • charAt

      public int charAt(int pos)
      Gets char code at given position for the text belonging to this renderer.
      Parameters:
      pos - the position in range [0; length())
      Returns:
      Unicode char code
    • getTabAnchorCharacterPosition

      public float getTabAnchorCharacterPosition()
    • getNextRenderer

      public IRenderer getNextRenderer()
      Gets a new instance of this class to be used as a next renderer, after this renderer is used, if layout(LayoutContext) is called more than once.

      If TextRenderer overflows to the next line, iText uses this method to create a renderer for the overflow part. So if one wants to extend TextRenderer, one should override this method: otherwise the default method will be used and thus the default rather than the custom renderer will be created. Another method that should be overridden in case of TextRenderer's extension is createCopy(GlyphLine, PdfFont). This method is responsible for creation of TextRenderer's copies, which represent its parts of specific font.

      Specified by:
      getNextRenderer in interface IRenderer
      Returns:
      new renderer instance
    • calculateAscenderDescender

      public static float[] calculateAscenderDescender(PdfFont font)
      Get ascender and descender from font metrics. If these values are obtained from typo metrics they are normalized with a scale coefficient.
      Parameters:
      font - from which metrics will be extracted
      Returns:
      array in which the first element is an ascender and the second is a descender
    • calculateAscenderDescender

      public static float[] calculateAscenderDescender(PdfFont font, RenderingMode mode)
      Get ascender and descender from font metrics. In RenderingMode.DEFAULT_LAYOUT_MODE if these values are obtained from typo metrics they are normalized with a scale coefficient.
      Parameters:
      font - from which metrics will be extracted
      mode - mode in which metrics will be obtained. Impact on the use of scale coefficient
      Returns:
      array in which the first element is an ascender and the second is a descender
    • getReversedRanges

      List<int[]> getReversedRanges()
    • initReversedRanges

      List<int[]> initReversedRanges()
    • removeReversedRanges

      TextRenderer removeReversedRanges()
    • splitIgnoreFirstNewLine

      private TextRenderer[] splitIgnoreFirstNewLine(int currentTextPos)
    • convertToGlyphLine

      private GlyphLine convertToGlyphLine(String text)
    • hasOtfFont

      private boolean hasOtfFont()
    • textContainsSpecialScriptGlyphs

      boolean textContainsSpecialScriptGlyphs(boolean analyzeSpecialScriptsWordBreakPointsOnly)
      Analyzes/checks whether text, bounded by start and end, contains glyphs belonging to special script. Mind that the behavior of this method depends on the analyzeSpecialScriptsWordBreakPointsOnly parameter: - pass false if you need to analyze the text by checking each of its glyphs AND to fill specialScriptsWordBreakPoints list afterwards, i.e. when analyzing a sequence of TextRenderers prior to layouting; - pass true if you want to check if text contains glyphs belonging to special scripts, according to the already filled specialScriptsWordBreakPoints list.
      Parameters:
      analyzeSpecialScriptsWordBreakPointsOnly - false if analysis of each glyph is required, true if analysis has already been performed earlier and the results are stored in specialScriptsWordBreakPoints
      Returns:
      true if text, bounded by start and end, contains glyphs belonging to special script, otherwise false
      See Also:
    • setSpecialScriptsWordBreakPoints

      void setSpecialScriptsWordBreakPoints(List<Integer> specialScriptsWordBreakPoints)
    • getSpecialScriptsWordBreakPoints

      List<Integer> getSpecialScriptsWordBreakPoints()
    • setSpecialScriptFirstNotFittingIndex

      void setSpecialScriptFirstNotFittingIndex(int lastFittingIndex)
    • getSpecialScriptFirstNotFittingIndex

      int getSpecialScriptFirstNotFittingIndex()
    • setIndexOfFirstCharacterToBeForcedToOverflow

      void setIndexOfFirstCharacterToBeForcedToOverflow(int indexOfFirstCharacterToBeForcedToOverflow)
    • getBackgroundArea

      protected Rectangle getBackgroundArea(Rectangle occupiedAreaWithMargins)
      Description copied from class: AbstractRenderer
      Evaluate the actual background
      Overrides:
      getBackgroundArea in class AbstractRenderer
      Parameters:
      occupiedAreaWithMargins - the current occupied area with applied margins
      Returns:
      the actual background area
    • getFirstYLineRecursively

      protected Float getFirstYLineRecursively()
      Description copied from class: AbstractRenderer
      Gets the first yLine of the nested children recursively. E.g. for a list, this will be the yLine of the first item (if the first item is indeed a paragraph). NOTE: this method will no go further than the first child.
      Overrides:
      getFirstYLineRecursively in class AbstractRenderer
      Returns:
      the first yline of the nested children, null if there is no text found
    • getLastYLineRecursively

      protected Float getLastYLineRecursively()
      Overrides:
      getLastYLineRecursively in class AbstractRenderer
    • lineLength

      protected int lineLength()
      Returns the length of the line which is the result of the layout call.
      Returns:
      the length of the line
    • baseCharactersCount

      protected int baseCharactersCount()
    • getMinMaxWidth

      public MinMaxWidth getMinMaxWidth()
      Description copied from class: AbstractRenderer
      Calculates min and max width values for current renderer.
      Overrides:
      getMinMaxWidth in class AbstractRenderer
      Returns:
      instance of MinMaxWidth
    • getNumberOfSpaces

      protected int getNumberOfSpaces()
    • createSplitRenderer

      protected TextRenderer createSplitRenderer()
    • createOverflowRenderer

      protected TextRenderer createOverflowRenderer()
    • split

      protected TextRenderer[] split(int initialOverflowTextPos)
    • drawSingleUnderline

      protected void drawSingleUnderline(Underline underline, TransparentColor fontStrokeColor, PdfCanvas canvas, float fontSize, float italicAngleTan)
    • calculateLineWidth

      protected float calculateLineWidth()
    • resolveFonts

      protected boolean resolveFonts(List<IRenderer> addTo)
      Resolve Property.FONT String[] value.
      Parameters:
      addTo - add all processed renderers to.
      Returns:
      true, if new TextRenderer has been created.
    • setProcessedGlyphLineAndFont

      protected void setProcessedGlyphLineAndFont(GlyphLine gl, PdfFont font)
    • createCopy

      protected TextRenderer createCopy(GlyphLine gl, PdfFont font)
      Creates a copy of this TextRenderer, which corresponds to the passed GlyphLine with PdfFont.

      While processing TextRenderer, iText uses this method to create glyph lines of specific fonts, which represent the TextRenderer's parts. If one extends TextRenderer, one should override this method, otherwise if FontSelector related logic is triggered, copies of this TextRenderer will have the default behavior rather than the custom one.

      Parameters:
      gl - a GlyphLine which represents some of this TextRenderer's content
      font - a PdfFont for this part of the TextRenderer's content
      Returns:
      copy of this TextRenderer, which correspond to the passed GlyphLine with PdfFont
    • updateRangeBasedOnRemovedCharacters

      static void updateRangeBasedOnRemovedCharacters(ArrayList<Integer> removedIds, int[] range)
    • findPossibleBreaksSplitPosition

      static int findPossibleBreaksSplitPosition(List<Integer> list, int textStartBasedInitialOverflowTextPos, boolean amongPresentOnly)
    • codePointIsOfSpecialScript

      static boolean codePointIsOfSpecialScript(int codePoint)
    • resolveFirstPdfFont

      PdfFont resolveFirstPdfFont(String[] font, FontProvider provider, FontCharacteristics fc, FontSet additionalFonts)
      Description copied from class: AbstractRenderer
      Get first valid PdfFont for this renderer, based on given font-families, font provider and font characteristics. This method will not change font property of renderer. Also it is not guarantied that returned font will contain all glyphs used in renderer or its children.

      This method is usually needed for evaluating some layout characteristics like ascender or descender.

      Overrides:
      resolveFirstPdfFont in class AbstractRenderer
      Returns:
      a valid PdfFont instance based on renderer Property.FONT property.
    • isStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar

      boolean[] isStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar(ISplitCharacters splitCharacters)
      Identifies two properties for the layouted text renderer text: start and end break possibilities. First - if it ends with split character, second - if it starts with the split character which is at the same time is a whitespace character. These properties will later be used for identifying if we can consider this and previous/next text renderers chunks to be a part of a single word spanning across the text renderers boundaries. In the start of the text renderer we only care about split characters, which are white spaces, because only such will allow soft-breaks before them: normally split characters allow breaks only after them.
      Parameters:
      splitCharacters - current renderer ISplitCharacters property value
      Returns:
      a boolean array of two elements, where first element identifies start break possibility, and second - end break possibility.
    • drawAndTagSingleUnderline

      private void drawAndTagSingleUnderline(boolean isTagged, Underline underline, TransparentColor fontStrokeColor, PdfCanvas canvas, float fontSize, float italicAngleTan)
    • getCharWidth

      private float getCharWidth(Glyph g, float fontSize, Float hScale, Float characterSpacing, Float wordSpacing)
    • scaleXAdvance

      private float scaleXAdvance(float xAdvance, float fontSize, Float hScale)
    • getGlyphLineWidth

      private float getGlyphLineWidth(GlyphLine glyphLine, float fontSize, float hScale, Float characterSpacing, Float wordSpacing)
    • getWordBoundsForHyphenation

      private int[] getWordBoundsForHyphenation(GlyphLine text, int leftTextPos, int rightTextPos, int wordMiddleCharPos)
    • isGlyphPartOfWordForHyphenation

      private boolean isGlyphPartOfWordForHyphenation(Glyph g)
    • updateFontAndText

      private void updateFontAndText()
    • saveWordBreakIfNotYetSaved

      private void saveWordBreakIfNotYetSaved(Glyph wordBreak)
    • numberOfElementsLessThan

      private static int numberOfElementsLessThan(ArrayList<Integer> numbers, int n)
    • numberOfElementsLessThanOrEqual

      private static int numberOfElementsLessThanOrEqual(ArrayList<Integer> numbers, int n)
    • noPrint

      private static boolean noPrint(Glyph g)
    • glyphBelongsToNonBreakingHyphenRelatedChunk

      private static boolean glyphBelongsToNonBreakingHyphenRelatedChunk(GlyphLine text, int ind)