Class PdfBoxGraphics2D

java.lang.Object
java.awt.Graphics
java.awt.Graphics2D
de.rototor.pdfbox.graphics2d.PdfBoxGraphics2D

public class PdfBoxGraphics2D extends Graphics2D
Graphics 2D Adapter for PDFBox.
  • Field Details

  • Constructor Details

    • PdfBoxGraphics2D

      public PdfBoxGraphics2D(org.apache.pdfbox.pdmodel.PDDocument document, int pixelWidth, int pixelHeight) throws IOException
      Create a PDfBox Graphics2D. This size is used for the BBox of the XForm. So everything drawn outside the rectangle (0x0)-(pixelWidth,pixelHeight) will be clipped.

      Note: pixelWidth and pixelHeight only define the size of the coordinate space within this Graphics2D. They do not affect how big the XForm is finally displayed in the PDF.

      Parameters:
      document - The document the graphics should be used to create a XForm in.
      pixelWidth - the width in pixel of the drawing area.
      pixelHeight - the height in pixel of the drawing area.
      Throws:
      IOException - if something goes wrong with writing into the content stream of the PDDocument.
    • PdfBoxGraphics2D

      public PdfBoxGraphics2D(org.apache.pdfbox.pdmodel.PDDocument document, float pixelWidth, float pixelHeight) throws IOException
      Create a PDfBox Graphics2D. This size is used for the BBox of the XForm. So everything drawn outside the rectangle (0x0)-(pixelWidth,pixelHeight) will be clipped.

      Note: pixelWidth and pixelHeight only define the size of the coordinate space within this Graphics2D. They do not affect how big the XForm is finally displayed in the PDF.

      Parameters:
      document - The document the graphics should be used to create a XForm in.
      pixelWidth - the width in pixel of the drawing area.
      pixelHeight - the height in pixel of the drawing area.
      Throws:
      IOException - if something goes wrong with writing into the content stream of the PDDocument.
    • PdfBoxGraphics2D

      public PdfBoxGraphics2D(org.apache.pdfbox.pdmodel.PDDocument document, org.apache.pdfbox.pdmodel.common.PDRectangle bbox) throws IOException
      Parameters:
      document - The document the graphics should be used to create a XForm in.
      bbox - Bounding Box of the graphics
      Throws:
      IOException - when something goes wrong with writing into the content stream of the PDDocument.
    • PdfBoxGraphics2D

      PdfBoxGraphics2D(org.apache.pdfbox.pdmodel.PDDocument document, org.apache.pdfbox.pdmodel.common.PDRectangle bbox, PdfBoxGraphics2D parentGfx) throws IOException
      Throws:
      IOException
    • PdfBoxGraphics2D

      private PdfBoxGraphics2D(PdfBoxGraphics2D gfx) throws IOException
      Throws:
      IOException
  • Method Details

    • setColorMapper

      public void setColorMapper(IPdfBoxGraphics2DColorMapper colorMapper)
      Set a new color mapper.
      Parameters:
      colorMapper - the color mapper which maps Color to PDColor.
    • setImageEncoder

      public void setImageEncoder(IPdfBoxGraphics2DImageEncoder imageEncoder)
      Set a new image encoder
      Parameters:
      imageEncoder - the image encoder, which encodes an image as PDImageXForm.
    • setPaintApplier

      public void setPaintApplier(IPdfBoxGraphics2DPaintApplier paintApplier)
      Set a new paint applier. You should always derive your custom paint applier from the IPdfBoxGraphics2DPaintApplier and just extend the paint mapping for custom paint.

      If the paint you map is a paint from a standard library, and you can implement the mapping using reflection please feel free to send a pull request to extend the default paint mapper.

      Parameters:
      paintApplier - the paint applier responsible for mapping the paint correctly
    • setDrawControl

      public void setDrawControl(IPdfBoxGraphics2DDrawControl drawControl)
      Set a new draw control. This allows you to influence fill() and draw() operations. drawString() is only influence if the text is drawn as vector shape.
      Parameters:
      drawControl - the draw control
    • setFontTextDrawer

      public void setFontTextDrawer(IPdfBoxGraphics2DFontTextDrawer fontTextDrawer)
      Set an optional text drawer. By default, all text is vectorized and drawn using vector shapes. To embed fonts into a PDF file it is necessary to have the underlying TTF file. The java.awt.Font class does not provide that. The FontTextDrawer must perform the java.awt.Font <=> PDFont mapping and also must perform the text layout. If it can not map the text or font correctly, the font drawing falls back to vectoring the text.
      Parameters:
      fontTextDrawer - The text drawer, which can draw text using fonts
    • getResources

      public org.apache.pdfbox.pdmodel.PDResources getResources()
      Sometimes you need to access the PDResources and add special resources to it for some stuff (e.g. patterns of embedded PDFs or simmilar). For that you need the PDResources associated with the XForm.

      It's identlical with getXFormObject().getResources(), with the difference beeing that you can access it while the Graphics2D is not yet disposed.

      Returns:
      the PDResources of the resulting XForm
    • getXFormObject

      public org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject getXFormObject()
      *AFTER* you have disposed() this Graphics2D you can access the XForm
      Returns:
      the PDFormXObject which resulted in this graphics
    • gatherContext

      private String gatherContext()
    • disposeDanglingChildGraphics

      public void disposeDanglingChildGraphics()
      Sometimes the users of create() don't correctly dispose() the child graphics they create. And you may not always be able to fix this uses, as it may be in some 3rdparty library. In this case this method can help you. It will cleanup all dangling child graphics. The child graphics can not be used after that. This method is a workaround for a buggy old code. You should only use it if you have to.

      Note: You can only call this method on the "main" graphics, not on a child created with create()

    • disposeCopies

      private static void disposeCopies(List<PdfBoxGraphics2D.CopyInfo> cl)
    • dispose

      public void dispose()
      Specified by:
      dispose in class Graphics
    • draw

      public void draw(Shape s)
      Specified by:
      draw in class Graphics2D
    • applyStroke

      private void applyStroke(Stroke strokeToApply) throws IOException
      Internal usage only!
      Parameters:
      strokeToApply - the stroke we should apply on the stream
      Throws:
      IOException
    • calculateTransformedLength

      private float calculateTransformedLength(float length, AffineTransform tf)
    • getCurrentEffectiveTransform

      private AffineTransform getCurrentEffectiveTransform()
    • drawImage

      public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
      Specified by:
      drawImage in class Graphics2D
    • drawRenderedImage

      public void drawRenderedImage(RenderedImage img, AffineTransform xform)
      Specified by:
      drawRenderedImage in class Graphics2D
    • drawRenderableImage

      public void drawRenderableImage(RenderableImage img, AffineTransform xform)
      Specified by:
      drawRenderableImage in class Graphics2D
    • drawString

      public void drawString(String str, int x, int y)
      Specified by:
      drawString in class Graphics2D
    • drawString

      public void drawString(String str, float x, float y)
      Specified by:
      drawString in class Graphics2D
    • drawString

      public void drawString(AttributedCharacterIterator iterator, int x, int y)
      Specified by:
      drawString in class Graphics2D
    • drawImage

      public boolean drawImage(Image img, int x, int y, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawImage

      public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawImage

      public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawImage

      public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawImage

      public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawImage

      public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
      Specified by:
      drawImage in class Graphics2D
    • drawImage

      public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
      Specified by:
      drawImage in class Graphics
    • drawStringUsingShapes

      private void drawStringUsingShapes(AttributedCharacterIterator iterator, float x, float y)
    • drawString

      public void drawString(AttributedCharacterIterator iterator, float x, float y)
      Specified by:
      drawString in class Graphics2D
    • drawStringUsingText

      private void drawStringUsingText(AttributedCharacterIterator iterator, float x, float y) throws IOException, FontFormatException
      Throws:
      IOException
      FontFormatException
    • contentStreamSaveState

      private void contentStreamSaveState() throws IOException
      Throws:
      IOException
    • contentStreamRestoreState

      private void contentStreamRestoreState() throws IOException
      Throws:
      IOException
    • drawGlyphVector

      public void drawGlyphVector(GlyphVector g, float x, float y)
      Specified by:
      drawGlyphVector in class Graphics2D
    • fill

      public void fill(Shape s)
      Specified by:
      fill in class Graphics2D
    • walkAndFillFromApplyPaintResult

      private void walkAndFillFromApplyPaintResult(Shape shapeToFill, PdfBoxGraphics2D.PaintApplyResult result) throws IOException
      Throws:
      IOException
    • walkAndFillShape

      private void walkAndFillShape(Shape shapeToFill) throws IOException
      Throws:
      IOException
    • fill

      private void fill(boolean useEvenOdd) throws IOException
      Throws:
      IOException
    • applyShadingAsColor

      private void applyShadingAsColor(org.apache.pdfbox.pdmodel.graphics.shading.PDShading shading) throws IOException
      Throws:
      IOException
    • applyPaint

      private PdfBoxGraphics2D.PaintApplyResult applyPaint(Shape shapeToDraw) throws IOException
      Throws:
      IOException
    • applyPaint

      private PdfBoxGraphics2D.PaintApplyResult applyPaint(Paint paintToApply, Shape shapeToDraw) throws IOException
      Throws:
      IOException
    • hit

      public boolean hit(Rectangle rect, Shape s, boolean onStroke)
      Specified by:
      hit in class Graphics2D
    • getDeviceConfiguration

      public GraphicsConfiguration getDeviceConfiguration()
      Specified by:
      getDeviceConfiguration in class Graphics2D
    • setComposite

      public void setComposite(Composite comp)
      Specified by:
      setComposite in class Graphics2D
    • setPaint

      public void setPaint(Paint paint)
      Specified by:
      setPaint in class Graphics2D
    • setStroke

      public void setStroke(Stroke stroke)
      Specified by:
      setStroke in class Graphics2D
    • setRenderingHint

      public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
      Specified by:
      setRenderingHint in class Graphics2D
    • getRenderingHint

      public Object getRenderingHint(RenderingHints.Key hintKey)
      Specified by:
      getRenderingHint in class Graphics2D
    • setRenderingHints

      public void setRenderingHints(Map<?,?> hints)
      Specified by:
      setRenderingHints in class Graphics2D
    • addRenderingHints

      public void addRenderingHints(Map<?,?> hints)
      Specified by:
      addRenderingHints in class Graphics2D
    • getRenderingHints

      public RenderingHints getRenderingHints()
      Specified by:
      getRenderingHints in class Graphics2D
    • create

      public PdfBoxGraphics2D create()
      Creates a copy of this graphics object. Please call dispose() always on the copy after you have finished drawing with it.

      Never draw both in this copy and its parent graphics at the same time, as they all write to the same content stream. This will create a broken PDF content stream. You should get an IllegalStateException if you do so, but better just don't try.

      The copy allows you to have different transforms, paints, etc. than the parent graphics context without affecting the parent. You may also call create() on a copy, but always remember to call dispose() in reverse order.
      Specified by:
      create in class Graphics
      Returns:
      a copy of this Graphics.
    • drawInMarkedContentSequence

      public void drawInMarkedContentSequence(org.apache.pdfbox.cos.COSName tagName, IPdfBoxGraphics2DMarkedContentDrawer drawer)
      Draw on the Graphics2D and enclose the drawing command with a BMC/EMC content marking pair. See the PDF Spec about "Marked Content" for details.
      Parameters:
      tagName - A COSName for to tag the marked content
      drawer - is called with a (child) graphics to draw on. Please do *not* dispose() this graphics. Just draw on it. Any state changes on the given graphics will be reset after the drawing is finished
    • drawInMarkedContentSequence

      public void drawInMarkedContentSequence(org.apache.pdfbox.cos.COSName tagName, org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDPropertyList properties, IPdfBoxGraphics2DMarkedContentDrawer drawer)
      Draw on the Graphics2D and enclose the drawing command with a BDC/EMC content marking pair. See the PDF Spec about "Marked Content" for details.
      Parameters:
      tagName - A COSName for to tag the marked content
      properties - The properties to put by the marked sequence
      drawer - is called with a (child) graphics to draw on. Please do *not* dispose() this graphics. Just draw on it. Any state changes on the given graphics will be reset after the drawing is finished
    • create

      public PdfBoxGraphics2D create(int x, int y, int width, int height)
      Overrides:
      create in class Graphics
    • translate

      public void translate(int x, int y)
      Specified by:
      translate in class Graphics2D
    • getColor

      public Color getColor()
      Specified by:
      getColor in class Graphics
    • setColor

      public void setColor(Color color)
      Specified by:
      setColor in class Graphics
    • setPaintMode

      public void setPaintMode()
      Specified by:
      setPaintMode in class Graphics
    • setXORMode

      public void setXORMode(Color c1)
      XOR Mode is currently not implemented as it's not possible in PDF. This mode is ignored.
      Specified by:
      setXORMode in class Graphics
      Parameters:
      c1 - the XORMode Color
    • getFont

      public Font getFont()
      Specified by:
      getFont in class Graphics
    • setFont

      public void setFont(Font font)
      Specified by:
      setFont in class Graphics
    • getFontMetrics

      public FontMetrics getFontMetrics(Font f)
      Specified by:
      getFontMetrics in class Graphics
    • getClipBounds

      public Rectangle getClipBounds()
      Specified by:
      getClipBounds in class Graphics
    • clipRect

      public void clipRect(int x, int y, int width, int height)
      Specified by:
      clipRect in class Graphics
    • setClip

      public void setClip(int x, int y, int width, int height)
      Specified by:
      setClip in class Graphics
    • getClip

      public Shape getClip()
      Specified by:
      getClip in class Graphics
    • setClip

      public void setClip(Shape clip)
      Specified by:
      setClip in class Graphics
    • internalClip

      void internalClip(boolean useEvenOdd) throws IOException
      Perform a clip, but only if we really have an active clipping path
      Parameters:
      useEvenOdd - true when we should use the evenOdd rule.
      Throws:
      IOException
    • isFinite

      private static boolean isFinite(float f)
      Float#isFinite() is JDK 8+. We just copied the trivial implementation here. When we require JDK 8+ we can just drop this method and replace it bei Float#isFinite()
    • isFinite

      private static boolean isFinite(float[] coords, int count)
      Returns:
      true when all required values are finite
    • markPathIsOnStream

      void markPathIsOnStream()
      Set an internal flag that some path - which may be added from the paint applyer to the content stream or by walkShape() - is on the content stream. We can then safely clip() if there is a path on the content stream.
    • walkShape

      private boolean walkShape(Shape clip) throws IOException
      Walk the path and return true if we need to use the even odd winding rule.
      Returns:
      true if we need to use the even odd winding rule
      Throws:
      IOException
    • checkNoCopyActive

      private void checkNoCopyActive()
    • gatherDebugCopyInfo

      private static String gatherDebugCopyInfo(PdfBoxGraphics2D gfx)
    • throwException

      static <T> T throwException(Exception e)
      Internal helper function
      Parameters:
      e - exception to rethrow
    • copyArea

      public void copyArea(int x, int y, int width, int height, int dx, int dy)
      Specified by:
      copyArea in class Graphics
    • drawLine

      public void drawLine(int x1, int y1, int x2, int y2)
      Specified by:
      drawLine in class Graphics
    • fillRect

      public void fillRect(int x, int y, int width, int height)
      Specified by:
      fillRect in class Graphics
    • drawRect

      public void drawRect(int x, int y, int width, int height)
      Overrides:
      drawRect in class Graphics
    • clearRect

      public void clearRect(int x, int y, int width, int height)
      Specified by:
      clearRect in class Graphics
    • drawRoundRect

      public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
      Specified by:
      drawRoundRect in class Graphics
    • fillRoundRect

      public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
      Specified by:
      fillRoundRect in class Graphics
    • drawOval

      public void drawOval(int x, int y, int width, int height)
      Specified by:
      drawOval in class Graphics
    • fillOval

      public void fillOval(int x, int y, int width, int height)
      Specified by:
      fillOval in class Graphics
    • drawArc

      public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
      Specified by:
      drawArc in class Graphics
    • fillArc

      public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
      Specified by:
      fillArc in class Graphics
    • drawPolyline

      public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
      Specified by:
      drawPolyline in class Graphics
    • drawPolygon

      public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
      Specified by:
      drawPolygon in class Graphics
    • fillPolygon

      public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
      Specified by:
      fillPolygon in class Graphics
    • translate

      public void translate(double tx, double ty)
      Specified by:
      translate in class Graphics2D
    • rotate

      public void rotate(double theta)
      Specified by:
      rotate in class Graphics2D
    • rotate

      public void rotate(double theta, double x, double y)
      Specified by:
      rotate in class Graphics2D
    • scale

      public void scale(double sx, double sy)
      Specified by:
      scale in class Graphics2D
    • shear

      public void shear(double shx, double shy)
      Specified by:
      shear in class Graphics2D
    • transform

      public void transform(AffineTransform Tx)
      Specified by:
      transform in class Graphics2D
    • setTransform

      public void setTransform(AffineTransform Tx)
      Specified by:
      setTransform in class Graphics2D
    • getTransform

      public AffineTransform getTransform()
      Specified by:
      getTransform in class Graphics2D
    • getPaint

      public Paint getPaint()
      Specified by:
      getPaint in class Graphics2D
    • getComposite

      public Composite getComposite()
      Specified by:
      getComposite in class Graphics2D
    • setBackground

      public void setBackground(Color color)
      Specified by:
      setBackground in class Graphics2D
    • getBackground

      public Color getBackground()
      Specified by:
      getBackground in class Graphics2D
    • getStroke

      public Stroke getStroke()
      Specified by:
      getStroke in class Graphics2D
    • clip

      public void clip(Shape shape)
      Specified by:
      clip in class Graphics2D
    • getFontRenderContext

      public FontRenderContext getFontRenderContext()
      Specified by:
      getFontRenderContext in class Graphics2D