Search in sources :

Example 1 with PDPattern

use of org.apache.pdfbox.pdmodel.graphics.color.PDPattern in project pdfbox by apache.

the class PDResources method getColorSpace.

/**
 * Returns the color space resource with the given name, or null if none exists. This method is
 * for PDFBox internal use only, others should use {@link #getColorSpace(COSName)}.
 *
 * @param name Name of the color space resource.
 * @param wasDefault if current color space was used by a default color space. This parameter is
 * to
 * @return a new color space.
 * @throws IOException if something went wrong.
 */
public PDColorSpace getColorSpace(COSName name, boolean wasDefault) throws IOException {
    COSObject indirect = getIndirect(COSName.COLORSPACE, name);
    if (cache != null && indirect != null) {
        PDColorSpace cached = cache.getColorSpace(indirect);
        if (cached != null) {
            return cached;
        }
    }
    // get the instance
    PDColorSpace colorSpace;
    COSBase object = get(COSName.COLORSPACE, name);
    if (object != null) {
        colorSpace = PDColorSpace.create(object, this, wasDefault);
    } else {
        colorSpace = PDColorSpace.create(name, this, wasDefault);
    }
    // we can't cache PDPattern, because it holds page resources, see PDFBOX-2370
    if (cache != null && !(colorSpace instanceof PDPattern)) {
        cache.put(indirect, colorSpace);
    }
    return colorSpace;
}
Also used : COSObject(org.apache.pdfbox.cos.COSObject) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) COSBase(org.apache.pdfbox.cos.COSBase) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Example 2 with PDPattern

use of org.apache.pdfbox.pdmodel.graphics.color.PDPattern in project pdfbox by apache.

the class PageDrawer method drawImage.

@Override
public void drawImage(PDImage pdImage) throws IOException {
    Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
    AffineTransform at = ctm.createAffineTransform();
    if (!pdImage.getInterpolate()) {
        boolean isScaledUp = pdImage.getWidth() < Math.round(at.getScaleX()) || pdImage.getHeight() < Math.round(at.getScaleY());
        // stencils are excluded from this rule (see survey.pdf)
        if (isScaledUp || pdImage.isStencil()) {
            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
        }
    }
    if (pdImage.isStencil()) {
        if (getGraphicsState().getNonStrokingColor().getColorSpace() instanceof PDPattern) {
            // The earlier code for stencils (see "else") doesn't work with patterns because the
            // CTM is not taken into consideration.
            // this code is based on the fact that it is easily possible to draw the mask and
            // the paint at the correct place with the existing code, but not in one step.
            // Thus what we do is to draw both in separate images, then combine the two and draw
            // the result.
            // Note that the device scale is not used. In theory, some patterns can get better
            // at higher resolutions but the stencil would become more and more "blocky".
            // If anybody wants to do this, have a look at the code in showTransparencyGroup().
            // draw the paint
            Paint paint = getNonStrokingPaint();
            Rectangle2D unitRect = new Rectangle2D.Float(0, 0, 1, 1);
            Rectangle2D bounds = at.createTransformedShape(unitRect).getBounds2D();
            BufferedImage renderedPaint = new BufferedImage((int) Math.ceil(bounds.getWidth()), (int) Math.ceil(bounds.getHeight()), BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = (Graphics2D) renderedPaint.getGraphics();
            g.translate(-bounds.getMinX(), -bounds.getMinY());
            g.setPaint(paint);
            g.fill(bounds);
            g.dispose();
            // draw the mask
            BufferedImage mask = pdImage.getImage();
            BufferedImage renderedMask = new BufferedImage((int) Math.ceil(bounds.getWidth()), (int) Math.ceil(bounds.getHeight()), BufferedImage.TYPE_INT_RGB);
            g = (Graphics2D) renderedMask.getGraphics();
            g.translate(-bounds.getMinX(), -bounds.getMinY());
            AffineTransform imageTransform = new AffineTransform(at);
            imageTransform.scale(1.0 / mask.getWidth(), -1.0 / mask.getHeight());
            imageTransform.translate(0, -mask.getHeight());
            g.drawImage(mask, imageTransform, null);
            g.dispose();
            // apply the mask
            final int[] transparent = new int[4];
            int[] alphaPixel = null;
            WritableRaster raster = renderedPaint.getRaster();
            WritableRaster alpha = renderedMask.getRaster();
            int h = renderedMask.getRaster().getHeight();
            int w = renderedMask.getRaster().getWidth();
            for (int y = 0; y < h; y++) {
                for (int x = 0; x < w; x++) {
                    alphaPixel = alpha.getPixel(x, y, alphaPixel);
                    if (alphaPixel[0] == 255) {
                        raster.setPixel(x, y, transparent);
                    }
                }
            }
            // draw the image
            setClip();
            graphics.setComposite(getGraphicsState().getNonStrokingJavaComposite());
            graphics.drawImage(renderedPaint, AffineTransform.getTranslateInstance(bounds.getMinX(), bounds.getMinY()), null);
        } else {
            // fill the image with stenciled paint
            BufferedImage image = pdImage.getStencilImage(getNonStrokingPaint());
            // draw the image
            drawBufferedImage(image, at);
        }
    } else {
        if (subsamplingAllowed) {
            int subsampling = getSubsampling(pdImage, at);
            // draw the subsampled image
            drawBufferedImage(pdImage.getImage(null, subsampling), at);
        } else {
            // subsampling not allowed, draw the image
            drawBufferedImage(pdImage.getImage(), at);
        }
    }
    if (!pdImage.getInterpolate()) {
        // JDK 1.7 has a bug where rendering hints are reset by the above call to
        // the setRenderingHint method, so we re-set all hints, see PDFBOX-2302
        setRenderingHints();
    }
}
Also used : Matrix(org.apache.pdfbox.util.Matrix) WritableRaster(java.awt.image.WritableRaster) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) Rectangle2D(java.awt.geom.Rectangle2D) AffineTransform(java.awt.geom.AffineTransform) Paint(java.awt.Paint) TexturePaint(java.awt.TexturePaint) BufferedImage(java.awt.image.BufferedImage) Point(java.awt.Point) Paint(java.awt.Paint) TexturePaint(java.awt.TexturePaint) Graphics2D(java.awt.Graphics2D)

Example 3 with PDPattern

use of org.apache.pdfbox.pdmodel.graphics.color.PDPattern in project pdfbox by apache.

the class CreatePatternsPDF method main.

public static void main(String[] args) throws IOException {
    try (PDDocument doc = new PDDocument()) {
        PDPage page = new PDPage();
        doc.addPage(page);
        page.setResources(new PDResources());
        // Colored pattern, i.e. the pattern content stream will set its own color(s)
        try (PDPageContentStream pcs = new PDPageContentStream(doc, page)) {
            // Colored pattern, i.e. the pattern content stream will set its own color(s)
            PDColorSpace patternCS1 = new PDPattern(null, PDDeviceRGB.INSTANCE);
            // Table 75 spec
            PDTilingPattern tilingPattern1 = new PDTilingPattern();
            tilingPattern1.setBBox(new PDRectangle(0, 0, 10, 10));
            tilingPattern1.setPaintType(PDTilingPattern.PAINT_COLORED);
            tilingPattern1.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING);
            tilingPattern1.setXStep(10);
            tilingPattern1.setYStep(10);
            COSName patternName1 = page.getResources().add(tilingPattern1);
            try (PDPatternContentStream cs1 = new PDPatternContentStream(tilingPattern1)) {
                // Set color, draw diagonal line + 2 more diagonals so that corners look good
                cs1.setStrokingColor(Color.red);
                cs1.moveTo(0, 0);
                cs1.lineTo(10, 10);
                cs1.moveTo(-1, 9);
                cs1.lineTo(1, 11);
                cs1.moveTo(9, -1);
                cs1.lineTo(11, 1);
                cs1.stroke();
            }
            PDColor patternColor1 = new PDColor(patternName1, patternCS1);
            pcs.addRect(50, 500, 200, 200);
            pcs.setNonStrokingColor(patternColor1);
            pcs.fill();
            // Uncolored pattern - the color is passed later
            PDTilingPattern tilingPattern2 = new PDTilingPattern();
            tilingPattern2.setBBox(new PDRectangle(0, 0, 10, 10));
            tilingPattern2.setPaintType(PDTilingPattern.PAINT_UNCOLORED);
            tilingPattern2.setTilingType(PDTilingPattern.TILING_NO_DISTORTION);
            tilingPattern2.setXStep(10);
            tilingPattern2.setYStep(10);
            COSName patternName2 = page.getResources().add(tilingPattern2);
            try (PDPatternContentStream cs2 = new PDPatternContentStream(tilingPattern2)) {
                // draw a cross
                cs2.moveTo(0, 5);
                cs2.lineTo(10, 5);
                cs2.moveTo(5, 0);
                cs2.lineTo(5, 10);
                cs2.stroke();
            }
            // Uncolored pattern colorspace needs to know the colorspace
            // for the color values that will be passed when painting the fill
            PDColorSpace patternCS2 = new PDPattern(null, PDDeviceRGB.INSTANCE);
            PDColor patternColor2green = new PDColor(new float[] { 0, 1, 0 }, patternName2, patternCS2);
            pcs.addRect(300, 500, 100, 100);
            pcs.setNonStrokingColor(patternColor2green);
            pcs.fill();
            // same pattern again but with different color + different pattern start position
            PDColor patternColor2blue = new PDColor(new float[] { 0, 0, 1 }, patternName2, patternCS2);
            pcs.addRect(455, 505, 100, 100);
            pcs.setNonStrokingColor(patternColor2blue);
            pcs.fill();
        }
        doc.save("patterns.pdf");
    }
}
Also used : PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) PDPage(org.apache.pdfbox.pdmodel.PDPage) COSName(org.apache.pdfbox.cos.COSName) PDDocument(org.apache.pdfbox.pdmodel.PDDocument) PDPatternContentStream(org.apache.pdfbox.pdmodel.PDPatternContentStream) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) PDResources(org.apache.pdfbox.pdmodel.PDResources) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor)

Example 4 with PDPattern

use of org.apache.pdfbox.pdmodel.graphics.color.PDPattern in project pdfbox-graphics2d by rototor.

the class PdfBoxGraphics2DPaintApplier method applyTexturePaint.

private void applyTexturePaint(TexturePaint texturePaint, PaintApplierState state) throws IOException {
    Rectangle2D anchorRect = texturePaint.getAnchorRect();
    PDTilingPattern pattern = new PDTilingPattern();
    pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
    pattern.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING_FASTER_TILING);
    pattern.setBBox(new PDRectangle((float) anchorRect.getX(), (float) anchorRect.getY(), (float) anchorRect.getWidth(), (float) anchorRect.getHeight()));
    pattern.setXStep((float) anchorRect.getWidth());
    pattern.setYStep((float) anchorRect.getHeight());
    AffineTransform patternTransform = new AffineTransform();
    patternTransform.translate(0, anchorRect.getHeight());
    patternTransform.scale(1f, -1f);
    pattern.setMatrix(patternTransform);
    PDAppearanceStream appearance = new PDAppearanceStream(state.document);
    appearance.setResources(pattern.getResources());
    appearance.setBBox(pattern.getBBox());
    PDPageContentStream imageContentStream = new PDPageContentStream(state.document, appearance, ((COSStream) pattern.getCOSObject()).createOutputStream());
    BufferedImage texturePaintImage = texturePaint.getImage();
    PDImageXObject imageXObject = state.imageEncoder.encodeImage(state.document, imageContentStream, texturePaintImage);
    float ratioW = (float) ((anchorRect.getWidth()) / texturePaintImage.getWidth());
    float ratioH = (float) ((anchorRect.getHeight()) / texturePaintImage.getHeight());
    float paintHeight = (texturePaintImage.getHeight()) * ratioH;
    imageContentStream.drawImage(imageXObject, (float) anchorRect.getX(), (float) (paintHeight + anchorRect.getY()), texturePaintImage.getWidth() * ratioW, -paintHeight);
    imageContentStream.close();
    PDColorSpace patternCS1 = new PDPattern(null, imageXObject.getColorSpace());
    COSName tilingPatternName = state.resources.add(pattern);
    PDColor patternColor = new PDColor(tilingPatternName, patternCS1);
    state.contentStream.setNonStrokingColor(patternColor);
    state.contentStream.setStrokingColor(patternColor);
}
Also used : PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) Rectangle2D(java.awt.geom.Rectangle2D) BufferedImage(java.awt.image.BufferedImage) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor) PDImageXObject(org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) AffineTransform(java.awt.geom.AffineTransform) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Example 5 with PDPattern

use of org.apache.pdfbox.pdmodel.graphics.color.PDPattern in project pdfbox-graphics2d by rototor.

the class PdfBoxGraphics2DPaintApplier method applyPatternPaint.

/*
	 * Batik SVG Pattern Paint
	 */
private void applyPatternPaint(Paint paint, PaintApplierState state) throws IOException {
    Rectangle2D anchorRect = getPropertyValue(paint, "getPatternRect");
    AffineTransform paintPatternTransform = getPropertyValue(paint, "getPatternTransform");
    PDTilingPattern pattern = new PDTilingPattern();
    pattern.setPaintType(PDTilingPattern.PAINT_COLORED);
    pattern.setTilingType(PDTilingPattern.TILING_CONSTANT_SPACING_FASTER_TILING);
    pattern.setBBox(new PDRectangle((float) anchorRect.getX(), (float) anchorRect.getY(), (float) anchorRect.getWidth(), (float) anchorRect.getHeight()));
    pattern.setXStep((float) anchorRect.getWidth());
    pattern.setYStep((float) anchorRect.getHeight());
    AffineTransform patternTransform = new AffineTransform();
    if (paintPatternTransform != null) {
        paintPatternTransform = new AffineTransform(paintPatternTransform);
        paintPatternTransform.preConcatenate(state.tf);
        patternTransform.concatenate(paintPatternTransform);
    } else
        patternTransform.concatenate(state.tf);
    patternTransform.scale(1f, -1f);
    pattern.setMatrix(patternTransform);
    PDAppearanceStream appearance = new PDAppearanceStream(state.document);
    appearance.setResources(pattern.getResources());
    appearance.setBBox(pattern.getBBox());
    Object graphicsNode = getPropertyValue(paint, "getGraphicsNode");
    PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(state.document, pattern.getBBox(), state.env.getGraphics2D());
    try {
        Method paintMethod = graphicsNode.getClass().getMethod("paint", Graphics2D.class);
        paintMethod.invoke(graphicsNode, pdfBoxGraphics2D);
    } catch (Exception e) {
        System.err.println("PdfBoxGraphics2DPaintApplier error while drawing Batik PatternPaint");
        e.printStackTrace();
        return;
    }
    pdfBoxGraphics2D.dispose();
    PDFormXObject xFormObject = pdfBoxGraphics2D.getXFormObject();
    PDPageContentStream imageContentStream = new PDPageContentStream(state.document, appearance, ((COSStream) pattern.getCOSObject()).createOutputStream());
    imageContentStream.drawForm(xFormObject);
    imageContentStream.close();
    PDColorSpace patternCS1 = new PDPattern(null);
    COSName tilingPatternName = state.resources.add(pattern);
    PDColor patternColor = new PDColor(tilingPatternName, patternCS1);
    state.contentStream.setNonStrokingColor(patternColor);
    state.contentStream.setStrokingColor(patternColor);
}
Also used : PDAppearanceStream(org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream) Rectangle2D(java.awt.geom.Rectangle2D) Method(java.lang.reflect.Method) IOException(java.io.IOException) PDColor(org.apache.pdfbox.pdmodel.graphics.color.PDColor) PDTilingPattern(org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern) PDPattern(org.apache.pdfbox.pdmodel.graphics.color.PDPattern) AffineTransform(java.awt.geom.AffineTransform) PDFormXObject(org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDImageXObject(org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) PDFormXObject(org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject) PDPageContentStream(org.apache.pdfbox.pdmodel.PDPageContentStream) PDColorSpace(org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)

Aggregations

PDPattern (org.apache.pdfbox.pdmodel.graphics.color.PDPattern)10 PDColorSpace (org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace)9 PDColor (org.apache.pdfbox.pdmodel.graphics.color.PDColor)6 PDRectangle (org.apache.pdfbox.pdmodel.common.PDRectangle)5 PDTilingPattern (org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern)5 PDPageContentStream (org.apache.pdfbox.pdmodel.PDPageContentStream)4 AffineTransform (java.awt.geom.AffineTransform)3 Rectangle2D (java.awt.geom.Rectangle2D)3 PDAppearanceStream (org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream)3 Color (java.awt.Color)2 BufferedImage (java.awt.image.BufferedImage)2 IOException (java.io.IOException)2 COSName (org.apache.pdfbox.cos.COSName)2 PDImageXObject (org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject)2 PDAbstractPattern (org.apache.pdfbox.pdmodel.graphics.pattern.PDAbstractPattern)2 PDShadingPattern (org.apache.pdfbox.pdmodel.graphics.pattern.PDShadingPattern)2 PDShading (org.apache.pdfbox.pdmodel.graphics.shading.PDShading)2 Matrix (org.apache.pdfbox.util.Matrix)2 Graphics2D (java.awt.Graphics2D)1 Paint (java.awt.Paint)1