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;
}
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();
}
}
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");
}
}
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);
}
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);
}
Aggregations