Class PageDrawer


public class PageDrawer extends PDFGraphicsStreamEngine
Paints a page in a PDF document to a Graphics context. May be subclassed to provide custom rendering.

If you want to do custom graphics processing rather than Graphics2D rendering, then you should subclass PDFGraphicsStreamEngine instead. Subclassing PageDrawer is only suitable for cases where the goal is to render onto a Graphics2D surface. In that case you'll also have to subclass PDFRenderer and modify PDFRenderer.createPageDrawer(PageDrawerParameters).

  • Field Details

    • LOG

      private static final org.apache.commons.logging.Log LOG
    • renderer

      private final PDFRenderer renderer
    • subsamplingAllowed

      private final boolean subsamplingAllowed
    • graphics

      private Graphics2D graphics
    • xform

      private AffineTransform xform
    • xformScalingFactorX

      private float xformScalingFactorX
    • xformScalingFactorY

      private float xformScalingFactorY
    • pageSize

      private PDRectangle pageSize
    • flipTG

      private boolean flipTG
    • clipWindingRule

      private int clipWindingRule
    • linePath

      private GeneralPath linePath
    • lastClips

      private List<Path2D> lastClips
    • initialClip

      private Shape initialClip
    • textClippings

      private List<Shape> textClippings
    • fontGlyph2D

      private final Map<PDFont,Glyph2D> fontGlyph2D
    • tilingPaintFactory

      private final TilingPaintFactory tilingPaintFactory
    • transparencyGroupStack

      private final Deque<PageDrawer.TransparencyGroup> transparencyGroupStack
    • nestedHiddenOCGCount

      private int nestedHiddenOCGCount
    • destination

      private final RenderDestination destination
    • renderingHints

      private final RenderingHints renderingHints
    • imageDownscalingOptimizationThreshold

      private final float imageDownscalingOptimizationThreshold
    • annotationFilter

      private AnnotationFilter annotationFilter
      Default annotations filter, returns all annotations
  • Constructor Details

    • PageDrawer

      public PageDrawer(PageDrawerParameters parameters) throws IOException
      Constructor.
      Parameters:
      parameters - Parameters for page drawing.
      Throws:
      IOException - If there is an error loading properties from the file.
  • Method Details

    • getAnnotationFilter

      public AnnotationFilter getAnnotationFilter()
      Return the AnnotationFilter.
      Returns:
      the AnnotationFilter
    • setAnnotationFilter

      public void setAnnotationFilter(AnnotationFilter annotationFilter)
      Set the AnnotationFilter.

      Allows to only render annotation accepted by the filter.

      Parameters:
      annotationFilter - the AnnotationFilter
    • getRenderer

      public final PDFRenderer getRenderer()
      Returns the parent renderer.
    • getGraphics

      protected final Graphics2D getGraphics()
      Returns the underlying Graphics2D. May be null if drawPage has not yet been called.
    • getLinePath

      protected final GeneralPath getLinePath()
      Returns the current line path. This is reset to empty after each fill/stroke.
    • setRenderingHints

      private void setRenderingHints()
      Sets high-quality rendering hints on the current Graphics2D.
    • drawPage

      public void drawPage(Graphics g, PDRectangle pageSize) throws IOException
      Draws the page to the requested context.
      Parameters:
      g - The graphics context to draw onto.
      pageSize - The size of the page to draw.
      Throws:
      IOException - If there is an IO error while drawing the page.
    • drawTilingPattern

      void drawTilingPattern(Graphics2D g, PDTilingPattern pattern, PDColorSpace colorSpace, PDColor color, Matrix patternMatrix) throws IOException
      Draws the pattern stream to the requested context.
      Parameters:
      g - The graphics context to draw onto.
      pattern - The tiling pattern to be used.
      colorSpace - color space for this tiling.
      color - color for this tiling.
      patternMatrix - the pattern matrix
      Throws:
      IOException - If there is an IO error while drawing the page.
    • clampColor

      private float clampColor(float color)
    • getPaint

      protected Paint getPaint(PDColor color) throws IOException
      Returns an AWT paint for the given PDColor.
      Parameters:
      color - The color to get a paint for. This can be an actual color or a pattern.
      Throws:
      IOException
    • setClip

      protected final void setClip()
      Sets the clipping path using caching for performance. We track lastClip manually because Graphics.getClip() returns a new object instead of the same one passed to setClip(). You may need to call this if you override showGlyph(). See PDFBOX-5093 for more.
    • transferClip

      protected void transferClip(Graphics2D graphics)
      Transfer clip to the destination device. Override this if you want to avoid to do slow intersecting operations but want the destination device to do this (e.g. SVG). You can get the individual clippings via PDGraphicsState.getCurrentClippingPaths(). See PDFBOX-5258 for sample code.
      Parameters:
      graphics - graphics device
    • beginText

      public void beginText() throws IOException
      Description copied from class: PDFStreamEngine
      Called when the BT operator is encountered. This method is for overriding in subclasses, the default implementation does nothing.
      Overrides:
      beginText in class PDFStreamEngine
      Throws:
      IOException - if there was an error processing the text
    • endText

      public void endText() throws IOException
      Description copied from class: PDFStreamEngine
      Called when the ET operator is encountered. This method is for overriding in subclasses, the default implementation does nothing.
      Overrides:
      endText in class PDFStreamEngine
      Throws:
      IOException - if there was an error processing the text
    • beginTextClip

      private void beginTextClip()
      Begin buffering the text clipping path, if any.
    • endTextClip

      private void endTextClip()
      End buffering the text clipping path, if any.
    • showFontGlyph

      protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, Vector displacement) throws IOException
      Description copied from class: PDFStreamEngine
      Called when a glyph is to be processed. This method is intended for overriding in subclasses, the default implementation does nothing.
      Overrides:
      showFontGlyph in class PDFStreamEngine
      Parameters:
      textRenderingMatrix - the current text rendering matrix, Trm
      font - the current font
      code - internal PDF character code for the glyph
      displacement - the displacement (i.e. advance) of the glyph in text space
      Throws:
      IOException - if the glyph cannot be processed
    • drawGlyph2D

      private void drawGlyph2D(Glyph2D glyph2D, PDFont font, int code, Vector displacement, AffineTransform at) throws IOException
      Render the font using the Glyph2D interface.
      Parameters:
      glyph2D - the Glyph2D implementation provided a GeneralPath for each glyph
      font - the font
      code - character code
      displacement - the glyph's displacement (advance)
      at - the transformation
      Throws:
      IOException - if something went wrong
    • showType3Glyph

      protected void showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int code, Vector displacement) throws IOException
      Description copied from class: PDFStreamEngine
      Called when a glyph is to be processed. This method is intended for overriding in subclasses, the default implementation does nothing.
      Overrides:
      showType3Glyph in class PDFStreamEngine
      Parameters:
      textRenderingMatrix - the current text rendering matrix, Trm
      font - the current font
      code - internal PDF character code for the glyph
      displacement - the displacement (i.e. advance) of the glyph in text space
      Throws:
      IOException - if the glyph cannot be processed
    • createGlyph2D

      private Glyph2D createGlyph2D(PDFont font) throws IOException
      Provide a Glyph2D for the given font.
      Parameters:
      font - the font
      Returns:
      the implementation of the Glyph2D interface for the given font
      Throws:
      IOException - if something went wrong
    • appendRectangle

      public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3)
      Description copied from class: PDFGraphicsStreamEngine
      Append a rectangle to the current path.
      Specified by:
      appendRectangle in class PDFGraphicsStreamEngine
      Parameters:
      p0 - point P0 of the rectangle.
      p1 - point P1 of the rectangle.
      p2 - point P2 of the rectangle.
      p3 - point P3 of the rectangle.
    • applySoftMaskToPaint

      private Paint applySoftMaskToPaint(Paint parentPaint, PDSoftMask softMask) throws IOException
      Throws:
      IOException
    • adjustImage

      private BufferedImage adjustImage(BufferedImage gray)
    • getStrokingPaint

      private Paint getStrokingPaint() throws IOException
      Throws:
      IOException
    • getNonStrokingPaint

      protected final Paint getNonStrokingPaint() throws IOException
      Returns the non-stroking AWT Paint. You may need to call this if you override showGlyph(). See PDFBOX-5093 for more.
      Returns:
      The non-stroking AWT Paint.
      Throws:
      IOException
    • getStroke

      private Stroke getStroke()
    • isAllZeroDash

      private boolean isAllZeroDash(float[] dashArray)
    • getDashArray

      private float[] getDashArray(PDLineDashPattern dashPattern)
    • strokePath

      public void strokePath() throws IOException
      Description copied from class: PDFGraphicsStreamEngine
      Stroke the path.
      Specified by:
      strokePath in class PDFGraphicsStreamEngine
      Throws:
      IOException - If there is an IO error while stroking the path.
    • fillPath

      public void fillPath(int windingRule) throws IOException
      Description copied from class: PDFGraphicsStreamEngine
      Fill the path.
      Specified by:
      fillPath in class PDFGraphicsStreamEngine
      Parameters:
      windingRule - The winding rule this path will use.
      Throws:
      IOException - if something went wrong.
    • intersectShadingBBox

      private void intersectShadingBBox(PDColor color, Area area) throws IOException
      Throws:
      IOException
    • isRectangular

      private boolean isRectangular(GeneralPath path)
      Returns true if the given path is rectangular.
    • fillAndStrokePath

      public void fillAndStrokePath(int windingRule) throws IOException
      Fills and then strokes the path.
      Specified by:
      fillAndStrokePath in class PDFGraphicsStreamEngine
      Parameters:
      windingRule - The winding rule this path will use.
      Throws:
      IOException - If there is an IO error while filling the path.
    • clip

      public void clip(int windingRule)
      Description copied from class: PDFGraphicsStreamEngine
      Modify the current clipping path by intersecting it with the current path. The clipping path will not be updated until the succeeding painting operator is called.
      Specified by:
      clip in class PDFGraphicsStreamEngine
      Parameters:
      windingRule - The winding rule which will be used for clipping.
    • moveTo

      public void moveTo(float x, float y)
      Description copied from class: PDFGraphicsStreamEngine
      Starts a new path at (x,y).
      Specified by:
      moveTo in class PDFGraphicsStreamEngine
      Parameters:
      x - x-coordinate of the target point.
      y - y-coordinate of the target point.
    • lineTo

      public void lineTo(float x, float y)
      Description copied from class: PDFGraphicsStreamEngine
      Draws a line from the current point to (x,y).
      Specified by:
      lineTo in class PDFGraphicsStreamEngine
      Parameters:
      x - x-coordinate of the end point of the line.
      y - y-coordinate of the end point of the line.
    • curveTo

      public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)
      Description copied from class: PDFGraphicsStreamEngine
      Draws a curve from the current point to (x3,y3) using (x1,y1) and (x2,y2) as control points.
      Specified by:
      curveTo in class PDFGraphicsStreamEngine
      Parameters:
      x1 - x-coordinate of the first control point.
      y1 - y-coordinate of the first control point.
      x2 - x-coordinate of the second control point.
      y2 - y-coordinate of the second control point.
      x3 - x-coordinate of the end point of the curve.
      y3 - y-coordinate of the end point of the curve.
    • getCurrentPoint

      public Point2D getCurrentPoint()
      Description copied from class: PDFGraphicsStreamEngine
      Returns the current point of the current path.
      Specified by:
      getCurrentPoint in class PDFGraphicsStreamEngine
      Returns:
      the current point.
    • closePath

      public void closePath()
      Description copied from class: PDFGraphicsStreamEngine
      Closes the current path.
      Specified by:
      closePath in class PDFGraphicsStreamEngine
    • endPath

      public void endPath()
      Description copied from class: PDFGraphicsStreamEngine
      Ends the current path without filling or stroking it. The clipping path is updated here.
      Specified by:
      endPath in class PDFGraphicsStreamEngine
    • drawImage

      public void drawImage(PDImage pdImage) throws IOException
      Description copied from class: PDFGraphicsStreamEngine
      Draw the image.
      Specified by:
      drawImage in class PDFGraphicsStreamEngine
      Parameters:
      pdImage - The image to draw.
      Throws:
      IOException - if something went wrong.
    • getSubsampling

      private int getSubsampling(PDImage pdImage, AffineTransform at)
      Calculated the subsampling frequency for a given PDImage based on the current transformation and its calculated transform
      Parameters:
      pdImage - PDImage to be drawn
      at - Transform that will be applied to the image when drawing
      Returns:
      The rounded-down ratio of image pixels to drawn pixels. Returned value will always be >=1.
    • drawBufferedImage

      private void drawBufferedImage(BufferedImage image, AffineTransform at) throws IOException
      Throws:
      IOException
    • applyTransferFunction

      private BufferedImage applyTransferFunction(BufferedImage image, COSBase transfer) throws IOException
      Throws:
      IOException
    • shadingFill

      public void shadingFill(COSName shadingName) throws IOException
      Description copied from class: PDFGraphicsStreamEngine
      Fill with Shading.
      Specified by:
      shadingFill in class PDFGraphicsStreamEngine
      Parameters:
      shadingName - The name of the Shading Dictionary to use for this fill instruction.
      Throws:
      IOException - if something went wrong.
    • showAnnotation

      public void showAnnotation(PDAnnotation annotation) throws IOException
      Description copied from class: PDFStreamEngine
      Shows the given annotation.
      Overrides:
      showAnnotation in class PDFStreamEngine
      Parameters:
      annotation - An annotation on the current page.
      Throws:
      IOException - If an error occurred reading the annotation
    • showForm

      public void showForm(PDFormXObject form) throws IOException
      Shows a form from the content stream.
      Overrides:
      showForm in class PDFStreamEngine
      Parameters:
      form - form XObject
      Throws:
      IOException - if the form cannot be processed
    • showTransparencyGroup

      public void showTransparencyGroup(PDTransparencyGroup form) throws IOException
      Description copied from class: PDFStreamEngine
      Shows a transparency group from the content stream.
      Overrides:
      showTransparencyGroup in class PDFStreamEngine
      Parameters:
      form - transparency group (form) XObject
      Throws:
      IOException - if the transparency group cannot be processed
    • showTransparencyGroupOnGraphics

      protected void showTransparencyGroupOnGraphics(PDTransparencyGroup form, Graphics2D graphics) throws IOException
      For advanced users, to extract the transparency group into a separate graphics device.
      Parameters:
      form -
      graphics -
      Throws:
      IOException
    • hasBlendMode

      private boolean hasBlendMode(PDTransparencyGroup group, Set<COSBase> groupsDone)
    • beginMarkedContentSequence

      public void beginMarkedContentSequence(COSName tag, COSDictionary properties)
      Called when a marked content group begins
      Overrides:
      beginMarkedContentSequence in class PDFStreamEngine
      Parameters:
      tag - indicates the role or significance of the sequence
      properties - optional properties
    • endMarkedContentSequence

      public void endMarkedContentSequence()
      Called when a marked content group ends
      Overrides:
      endMarkedContentSequence in class PDFStreamEngine
    • isContentRendered

      private boolean isContentRendered()
    • isHiddenOCG

      private boolean isHiddenOCG(PDPropertyList propertyList)
    • isHiddenOCMD

      private boolean isHiddenOCMD(PDOptionalContentMembershipDictionary ocmd)