Package org.apache.pdfbox.rendering
Class PageDrawer
- java.lang.Object
-
- org.apache.pdfbox.contentstream.PDFStreamEngine
-
- org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine
-
- org.apache.pdfbox.rendering.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 aGraphics2D
surface. In that case you'll also have to subclassPDFRenderer
and modifyPDFRenderer.createPageDrawer(PageDrawerParameters)
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
PageDrawer.TransparencyGroup
Transparency group.
-
Field Summary
Fields Modifier and Type Field Description private AnnotationFilter
annotationFilter
Default annotations filter, returns all annotationsprivate int
clipWindingRule
private RenderDestination
destination
private boolean
flipTG
private java.util.Map<PDFont,Glyph2D>
fontGlyph2D
private java.awt.Graphics2D
graphics
private float
imageDownscalingOptimizationThreshold
private java.awt.Shape
initialClip
(package private) static int
JAVA_VERSION
private java.awt.geom.Area
lastClip
private java.awt.geom.GeneralPath
linePath
private static org.apache.commons.logging.Log
LOG
private int
nestedHiddenOCGCount
private PDRectangle
pageSize
private PDFRenderer
renderer
private java.awt.RenderingHints
renderingHints
private boolean
subsamplingAllowed
private java.util.List<java.awt.Shape>
textClippings
private TilingPaintFactory
tilingPaintFactory
private java.util.Deque<PageDrawer.TransparencyGroup>
transparencyGroupStack
private java.awt.geom.AffineTransform
xform
-
Constructor Summary
Constructors Constructor Description PageDrawer(PageDrawerParameters parameters)
Constructor.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private java.awt.image.BufferedImage
adjustImage(java.awt.image.BufferedImage gray)
private void
adjustRectangle(java.awt.geom.Rectangle2D r)
void
appendRectangle(java.awt.geom.Point2D p0, java.awt.geom.Point2D p1, java.awt.geom.Point2D p2, java.awt.geom.Point2D p3)
Append a rectangle to the current path.private java.awt.Paint
applySoftMaskToPaint(java.awt.Paint parentPaint, PDSoftMask softMask)
private java.awt.image.BufferedImage
applyTransferFunction(java.awt.image.BufferedImage image, COSBase transfer)
void
beginMarkedContentSequence(COSName tag, COSDictionary properties)
Called when a marked content group beginsvoid
beginText()
Called when the BT operator is encountered.private void
beginTextClip()
Begin buffering the text clipping path, if any.private float
clampColor(float color)
void
clip(int windingRule)
Modify the current clipping path by intersecting it with the current path.void
closePath()
Closes the current path.private Glyph2D
createGlyph2D(PDFont font)
Provide a Glyph2D for the given font.void
curveTo(float x1, float y1, float x2, float y2, float x3, float y3)
Draws a curve from the current point to (x3,y3) using (x1,y1) and (x2,y2) as control points.private void
drawBufferedImage(java.awt.image.BufferedImage image, java.awt.geom.AffineTransform at)
private void
drawGlyph2D(Glyph2D glyph2D, PDFont font, int code, Vector displacement, java.awt.geom.AffineTransform at)
Render the font using the Glyph2D interface.void
drawImage(PDImage pdImage)
Draw the image.void
drawPage(java.awt.Graphics g, PDRectangle pageSize)
Draws the page to the requested context.(package private) void
drawTilingPattern(java.awt.Graphics2D g, PDTilingPattern pattern, PDColorSpace colorSpace, PDColor color, Matrix patternMatrix)
Draws the pattern stream to the requested context.void
endMarkedContentSequence()
Called when a a marked content group endsvoid
endPath()
Ends the current path without filling or stroking it.void
endText()
Called when the ET operator is encountered.private void
endTextClip()
End buffering the text clipping path, if any.void
fillAndStrokePath(int windingRule)
Fills and then strokes the path.void
fillPath(int windingRule)
Fill the path.AnnotationFilter
getAnnotationFilter()
Return the AnnotationFilter.java.awt.geom.Point2D
getCurrentPoint()
Returns the current point of the current path.private float[]
getDashArray(PDLineDashPattern dashPattern)
protected java.awt.Graphics2D
getGraphics()
Returns the underlying Graphics2D.private static int
getJavaVersion()
protected java.awt.geom.GeneralPath
getLinePath()
Returns the current line path.private java.awt.Paint
getNonStrokingPaint()
protected java.awt.Paint
getPaint(PDColor color)
Returns an AWT paint for the given PDColor.PDFRenderer
getRenderer()
Returns the parent renderer.private java.awt.BasicStroke
getStroke()
private java.awt.Paint
getStrokingPaint()
private int
getSubsampling(PDImage pdImage, java.awt.geom.AffineTransform at)
Calculated the subsampling frequency for a given PDImage based on the current transformation and its calculated transformprivate boolean
hasBlendMode(PDTransparencyGroup group, java.util.Set<COSBase> groupsDone)
private void
intersectShadingBBox(PDColor color, java.awt.geom.Area area)
private boolean
isContentRendered()
private boolean
isHiddenOCG(PDPropertyList propertyList)
private boolean
isHiddenOCMD(PDOptionalContentMembershipDictionary ocmd)
private boolean
isRectangular(java.awt.geom.GeneralPath path)
Returns true if the given path is rectangular.void
lineTo(float x, float y)
Draws a line from the current point to (x,y).void
moveTo(float x, float y)
Starts a new path at (x,y).void
setAnnotationFilter(AnnotationFilter annotationFilter)
Set the AnnotationFilter.private void
setClip()
private void
setRenderingHints()
Sets high-quality rendering hints on the current Graphics2D.void
shadingFill(COSName shadingName)
Fill with Shading.void
showAnnotation(PDAnnotation annotation)
Shows the given annotation.protected void
showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, Vector displacement)
Called when a glyph is to be processed.void
showForm(PDFormXObject form)
Shows a form from the content stream.void
showTransparencyGroup(PDTransparencyGroup form)
Shows a transparency group from the content stream.protected void
showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int code, Vector displacement)
Called when a glyph is to be processed.void
strokePath()
Stroke the path.-
Methods inherited from class org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine
getPage
-
Methods inherited from class org.apache.pdfbox.contentstream.PDFStreamEngine
addOperator, applyTextAdjustment, decreaseLevel, getAppearance, getCurrentPage, getGraphicsStackSize, getGraphicsState, getInitialMatrix, getLevel, getResources, getTextLineMatrix, getTextMatrix, increaseLevel, operatorException, processAnnotation, processChildStream, processOperator, processOperator, processPage, processSoftMask, processTilingPattern, processTilingPattern, processTransparencyGroup, processType3Stream, registerOperatorProcessor, restoreGraphicsStack, restoreGraphicsState, saveGraphicsStack, saveGraphicsState, setLineDashPattern, setTextLineMatrix, setTextMatrix, showFontGlyph, showGlyph, showGlyph, showText, showTextString, showTextStrings, showType3Glyph, transformedPoint, transformWidth, unsupportedOperator
-
-
-
-
Field Detail
-
LOG
private static final org.apache.commons.logging.Log LOG
-
renderer
private final PDFRenderer renderer
-
subsamplingAllowed
private final boolean subsamplingAllowed
-
graphics
private java.awt.Graphics2D graphics
-
xform
private java.awt.geom.AffineTransform xform
-
pageSize
private PDRectangle pageSize
-
flipTG
private boolean flipTG
-
clipWindingRule
private int clipWindingRule
-
linePath
private java.awt.geom.GeneralPath linePath
-
lastClip
private java.awt.geom.Area lastClip
-
initialClip
private java.awt.Shape initialClip
-
textClippings
private java.util.List<java.awt.Shape> textClippings
-
tilingPaintFactory
private final TilingPaintFactory tilingPaintFactory
-
transparencyGroupStack
private final java.util.Deque<PageDrawer.TransparencyGroup> transparencyGroupStack
-
nestedHiddenOCGCount
private int nestedHiddenOCGCount
-
destination
private final RenderDestination destination
-
renderingHints
private final java.awt.RenderingHints renderingHints
-
imageDownscalingOptimizationThreshold
private final float imageDownscalingOptimizationThreshold
-
JAVA_VERSION
static final int JAVA_VERSION
-
annotationFilter
private AnnotationFilter annotationFilter
Default annotations filter, returns all annotations
-
-
Constructor Detail
-
PageDrawer
public PageDrawer(PageDrawerParameters parameters) throws java.io.IOException
Constructor.- Parameters:
parameters
- Parameters for page drawing.- Throws:
java.io.IOException
- If there is an error loading properties from the file.
-
-
Method Detail
-
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 java.awt.Graphics2D getGraphics()
Returns the underlying Graphics2D. May be null if drawPage has not yet been called.
-
getLinePath
protected final java.awt.geom.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(java.awt.Graphics g, PDRectangle pageSize) throws java.io.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:
java.io.IOException
- If there is an IO error while drawing the page.
-
drawTilingPattern
void drawTilingPattern(java.awt.Graphics2D g, PDTilingPattern pattern, PDColorSpace colorSpace, PDColor color, Matrix patternMatrix) throws java.io.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:
java.io.IOException
- If there is an IO error while drawing the page.
-
clampColor
private float clampColor(float color)
-
getPaint
protected java.awt.Paint getPaint(PDColor color) throws java.io.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:
java.io.IOException
-
setClip
private void setClip()
-
beginText
public void beginText() throws java.io.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 classPDFStreamEngine
- Throws:
java.io.IOException
- if there was an error processing the text
-
endText
public void endText() throws java.io.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 classPDFStreamEngine
- Throws:
java.io.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 java.io.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 classPDFStreamEngine
- Parameters:
textRenderingMatrix
- the current text rendering matrix, Trmfont
- the current fontcode
- internal PDF character code for the glyphdisplacement
- the displacement (i.e. advance) of the glyph in text space- Throws:
java.io.IOException
- if the glyph cannot be processed
-
drawGlyph2D
private void drawGlyph2D(Glyph2D glyph2D, PDFont font, int code, Vector displacement, java.awt.geom.AffineTransform at) throws java.io.IOException
Render the font using the Glyph2D interface.- Parameters:
glyph2D
- the Glyph2D implementation provided a GeneralPath for each glyphfont
- the fontcode
- character codedisplacement
- the glyph's displacement (advance)at
- the transformation- Throws:
java.io.IOException
- if something went wrong
-
showType3Glyph
protected void showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int code, Vector displacement) throws java.io.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 classPDFStreamEngine
- Parameters:
textRenderingMatrix
- the current text rendering matrix, Trmfont
- the current fontcode
- internal PDF character code for the glyphdisplacement
- the displacement (i.e. advance) of the glyph in text space- Throws:
java.io.IOException
- if the glyph cannot be processed
-
createGlyph2D
private Glyph2D createGlyph2D(PDFont font) throws java.io.IOException
Provide a Glyph2D for the given font.- Parameters:
font
- the font- Returns:
- the implementation of the Glyph2D interface for the given font
- Throws:
java.io.IOException
- if something went wrong
-
appendRectangle
public void appendRectangle(java.awt.geom.Point2D p0, java.awt.geom.Point2D p1, java.awt.geom.Point2D p2, java.awt.geom.Point2D p3)
Description copied from class:PDFGraphicsStreamEngine
Append a rectangle to the current path.- Specified by:
appendRectangle
in classPDFGraphicsStreamEngine
- 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 java.awt.Paint applySoftMaskToPaint(java.awt.Paint parentPaint, PDSoftMask softMask) throws java.io.IOException
- Throws:
java.io.IOException
-
adjustRectangle
private void adjustRectangle(java.awt.geom.Rectangle2D r)
-
adjustImage
private java.awt.image.BufferedImage adjustImage(java.awt.image.BufferedImage gray)
-
getStrokingPaint
private java.awt.Paint getStrokingPaint() throws java.io.IOException
- Throws:
java.io.IOException
-
getNonStrokingPaint
private java.awt.Paint getNonStrokingPaint() throws java.io.IOException
- Throws:
java.io.IOException
-
getStroke
private java.awt.BasicStroke getStroke()
-
getDashArray
private float[] getDashArray(PDLineDashPattern dashPattern)
-
strokePath
public void strokePath() throws java.io.IOException
Description copied from class:PDFGraphicsStreamEngine
Stroke the path.- Specified by:
strokePath
in classPDFGraphicsStreamEngine
- Throws:
java.io.IOException
- If there is an IO error while stroking the path.
-
fillPath
public void fillPath(int windingRule) throws java.io.IOException
Description copied from class:PDFGraphicsStreamEngine
Fill the path.- Specified by:
fillPath
in classPDFGraphicsStreamEngine
- Parameters:
windingRule
- The winding rule this path will use.- Throws:
java.io.IOException
- if something went wrong.
-
intersectShadingBBox
private void intersectShadingBBox(PDColor color, java.awt.geom.Area area) throws java.io.IOException
- Throws:
java.io.IOException
-
isRectangular
private boolean isRectangular(java.awt.geom.GeneralPath path)
Returns true if the given path is rectangular.
-
fillAndStrokePath
public void fillAndStrokePath(int windingRule) throws java.io.IOException
Fills and then strokes the path.- Specified by:
fillAndStrokePath
in classPDFGraphicsStreamEngine
- Parameters:
windingRule
- The winding rule this path will use.- Throws:
java.io.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 classPDFGraphicsStreamEngine
- 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 classPDFGraphicsStreamEngine
- 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 classPDFGraphicsStreamEngine
- 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 classPDFGraphicsStreamEngine
- 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 java.awt.geom.Point2D getCurrentPoint()
Description copied from class:PDFGraphicsStreamEngine
Returns the current point of the current path.- Specified by:
getCurrentPoint
in classPDFGraphicsStreamEngine
- Returns:
- the current point.
-
closePath
public void closePath()
Description copied from class:PDFGraphicsStreamEngine
Closes the current path.- Specified by:
closePath
in classPDFGraphicsStreamEngine
-
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 classPDFGraphicsStreamEngine
-
drawImage
public void drawImage(PDImage pdImage) throws java.io.IOException
Description copied from class:PDFGraphicsStreamEngine
Draw the image.- Specified by:
drawImage
in classPDFGraphicsStreamEngine
- Parameters:
pdImage
- The image to draw.- Throws:
java.io.IOException
- if something went wrong.
-
getSubsampling
private int getSubsampling(PDImage pdImage, java.awt.geom.AffineTransform at)
Calculated the subsampling frequency for a given PDImage based on the current transformation and its calculated transform- Parameters:
pdImage
- PDImage to be drawnat
- 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(java.awt.image.BufferedImage image, java.awt.geom.AffineTransform at) throws java.io.IOException
- Throws:
java.io.IOException
-
applyTransferFunction
private java.awt.image.BufferedImage applyTransferFunction(java.awt.image.BufferedImage image, COSBase transfer) throws java.io.IOException
- Throws:
java.io.IOException
-
shadingFill
public void shadingFill(COSName shadingName) throws java.io.IOException
Description copied from class:PDFGraphicsStreamEngine
Fill with Shading.- Specified by:
shadingFill
in classPDFGraphicsStreamEngine
- Parameters:
shadingName
- The name of the Shading Dictionary to use for this fill instruction.- Throws:
java.io.IOException
- if something went wrong.
-
showAnnotation
public void showAnnotation(PDAnnotation annotation) throws java.io.IOException
Description copied from class:PDFStreamEngine
Shows the given annotation.- Overrides:
showAnnotation
in classPDFStreamEngine
- Parameters:
annotation
- An annotation on the current page.- Throws:
java.io.IOException
- If an error occurred reading the annotation
-
showForm
public void showForm(PDFormXObject form) throws java.io.IOException
Shows a form from the content stream.- Overrides:
showForm
in classPDFStreamEngine
- Parameters:
form
- form XObject- Throws:
java.io.IOException
- if the form cannot be processed
-
showTransparencyGroup
public void showTransparencyGroup(PDTransparencyGroup form) throws java.io.IOException
Description copied from class:PDFStreamEngine
Shows a transparency group from the content stream.- Overrides:
showTransparencyGroup
in classPDFStreamEngine
- Parameters:
form
- transparency group (form) XObject- Throws:
java.io.IOException
- if the transparency group cannot be processed
-
hasBlendMode
private boolean hasBlendMode(PDTransparencyGroup group, java.util.Set<COSBase> groupsDone)
-
beginMarkedContentSequence
public void beginMarkedContentSequence(COSName tag, COSDictionary properties)
Called when a marked content group begins- Overrides:
beginMarkedContentSequence
in classPDFStreamEngine
- Parameters:
tag
- indicates the role or significance of the sequenceproperties
- optional properties
-
endMarkedContentSequence
public void endMarkedContentSequence()
Called when a a marked content group ends- Overrides:
endMarkedContentSequence
in classPDFStreamEngine
-
isContentRendered
private boolean isContentRendered()
-
isHiddenOCG
private boolean isHiddenOCG(PDPropertyList propertyList)
-
isHiddenOCMD
private boolean isHiddenOCMD(PDOptionalContentMembershipDictionary ocmd)
-
getJavaVersion
private static int getJavaVersion()
-
-