pdfgraphics2d.java

来自「有关对pdf操作的代码」· Java 代码 · 共 1,655 行 · 第 1/4 页

JAVA
1,655
字号
                //if either width or height is 0, then there is nothing to draw        if (dwidth == 0 || dheight == 0 || swidth == 0 || sheight == 0) return true;                double scalex = dwidth/swidth;        double scaley = dheight/sheight;                double transx = sx1*scalex;        double transy = sy1*scaley;        AffineTransform tx = AffineTransform.getTranslateInstance(dx1-transx,dy1-transy);        tx.scale(scalex,scaley);                BufferedImage mask = new BufferedImage(img.getWidth(observer), img.getHeight(observer), BufferedImage.TYPE_BYTE_BINARY);        Graphics g = mask.getGraphics();        g.fillRect(sx1,sy1, (int)swidth, (int)sheight);        drawImage(img, mask, tx, null, observer);        g.dispose();        return true;    }        /**     * @see Graphics#dispose()     */    public void dispose() {        if (kid)            return;        if (!disposeCalled) {            disposeCalled = true;            cb.restoreState();            cb.restoreState();            dg2.dispose();            dg2 = null;            if (kids != null) {                ByteBuffer buf = new ByteBuffer();                internalDispose(buf);                ByteBuffer buf2 = cb.getInternalBuffer();                buf2.reset();                buf2.append(buf);            }        }    }        private void internalDispose(ByteBuffer buf) {        int last = 0;        int pos = 0;        ByteBuffer buf2 = cb.getInternalBuffer();        if (kids != null) {            for (int k = 0; k < kids.size(); k += 2) {                pos = ((Integer)kids.get(k)).intValue();                PdfGraphics2D g2 = (PdfGraphics2D)kids.get(k + 1);                g2.cb.restoreState();                g2.cb.restoreState();                buf.append(buf2.getBuffer(), last, pos - last);                g2.dg2.dispose();                g2.dg2 = null;                g2.internalDispose(buf);                last = pos;            }        }        buf.append(buf2.getBuffer(), last, buf2.size() - last);    }        ///////////////////////////////////////////////    //    //    //		implementation specific methods    //    //            private void followPath(Shape s, int drawType) {        if (s==null) return;        if (drawType==STROKE) {            if (!(stroke instanceof BasicStroke)) {                s = stroke.createStrokedShape(s);                followPath(s, FILL);                return;            }        }        if (drawType==STROKE) {            setStrokeDiff(stroke, oldStroke);            oldStroke = stroke;            setStrokePaint();        }        else if (drawType==FILL)            setFillPaint();        PathIterator points;        int traces = 0;        if (drawType == CLIP)            points = s.getPathIterator(IDENTITY);        else            points = s.getPathIterator(transform);        float[] coords = new float[6];        while(!points.isDone()) {            ++traces;            int segtype = points.currentSegment(coords);            normalizeY(coords);            switch(segtype) {                case PathIterator.SEG_CLOSE:                    cb.closePath();                    break;                case PathIterator.SEG_CUBICTO:                    cb.curveTo(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]);                    break;                case PathIterator.SEG_LINETO:                    cb.lineTo(coords[0], coords[1]);                    break;                case PathIterator.SEG_MOVETO:                    cb.moveTo(coords[0], coords[1]);                    break;                case PathIterator.SEG_QUADTO:                    cb.curveTo(coords[0], coords[1], coords[2], coords[3]);                    break;            }            points.next();        }        switch (drawType) {        case FILL:            if (traces > 0) {                if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD)                    cb.eoFill();                else                    cb.fill();            }            break;        case STROKE:            if (traces > 0)                cb.stroke();            break;        default: //drawType==CLIP            if (traces == 0)                cb.rectangle(0, 0, 0, 0);            if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD)                cb.eoClip();            else                cb.clip();            cb.newPath();        }    }        private float normalizeY(float y) {        return this.height - y;    }        private void normalizeY(float[] coords) {        coords[1] = normalizeY(coords[1]);        coords[3] = normalizeY(coords[3]);        coords[5] = normalizeY(coords[5]);    }        private AffineTransform normalizeMatrix() {        double[] mx = new double[6];        AffineTransform result = AffineTransform.getTranslateInstance(0,0);        result.getMatrix(mx);        mx[3]=-1;        mx[5]=height;        result = new AffineTransform(mx);        result.concatenate(transform);        return result;    }        private boolean drawImage(Image img, Image mask, AffineTransform xform, Color bgColor, ImageObserver obs) {        if (xform==null)            xform = new AffineTransform();        else            xform = new AffineTransform(xform);        xform.translate(0, img.getHeight(obs));        xform.scale(img.getWidth(obs), img.getHeight(obs));                AffineTransform inverse = this.normalizeMatrix();        AffineTransform flipper = AffineTransform.getScaleInstance(1,-1);        inverse.concatenate(xform);        inverse.concatenate(flipper);                double[] mx = new double[6];        inverse.getMatrix(mx);        if (currentFillGState != 255) {            PdfGState gs = fillGState[255];            if (gs == null) {                gs = new PdfGState();                gs.setFillOpacity(1);                fillGState[255] = gs;            }            cb.setGState(gs);        }                try {            com.lowagie.text.Image image = null;            if(!convertImagesToJPEG){                image = com.lowagie.text.Image.getInstance(img, bgColor);            }            else{                BufferedImage scaled = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);                Graphics2D g3 = scaled.createGraphics();                g3.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);                g3.dispose();                                ByteArrayOutputStream baos = new ByteArrayOutputStream();                ImageWriteParam iwparam = new JPEGImageWriteParam(Locale.getDefault());                iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);                iwparam.setCompressionQuality(jpegQuality);//Set here your compression rate                ImageWriter iw = (ImageWriter)ImageIO.getImageWritersByFormatName("jpg").next();                ImageOutputStream ios = ImageIO.createImageOutputStream(baos);                iw.setOutput(ios);                iw.write(null, new IIOImage(scaled, null, null), iwparam);                iw.dispose();                ios.close();                scaled.flush();                scaled = null;                image = com.lowagie.text.Image.getInstance(baos.toByteArray());                            }            if (mask!=null) {                com.lowagie.text.Image msk = com.lowagie.text.Image.getInstance(mask, null, true);                msk.makeMask();                msk.setInverted(true);                image.setImageMask(msk);            }            cb.addImage(image, (float)mx[0], (float)mx[1], (float)mx[2], (float)mx[3], (float)mx[4], (float)mx[5]);            Object url = getRenderingHint(HyperLinkKey.KEY_INSTANCE);            if (url != null && !url.equals(HyperLinkKey.VALUE_HYPERLINKKEY_OFF)) {            	PdfAction action = new  PdfAction(url.toString());                cb.setAction(action, (float)mx[4], (float)mx[5], (float)(mx[0]+mx[4]), (float)(mx[3]+mx[5]));            }        } catch (Exception ex) {            throw new IllegalArgumentException();        }        if (currentFillGState != 255) {            PdfGState gs = fillGState[currentFillGState];            cb.setGState(gs);        }                return true;    }        private boolean checkNewPaint(Paint oldPaint) {        if (paint == oldPaint)            return false;        return !((paint instanceof Color) && paint.equals(oldPaint));    }        private void setFillPaint() {        if (checkNewPaint(paintFill)) {            paintFill = paint;            setPaint(false, 0, 0, true);        }    }        private void setStrokePaint() {        if (checkNewPaint(paintStroke)) {            paintStroke = paint;            setPaint(false, 0, 0, false);        }    }        private void setPaint(boolean invert, double xoffset, double yoffset, boolean fill) {        if (paint instanceof Color) {            Color color = (Color)paint;            int alpha = color.getAlpha();            if (fill) {                if (alpha != currentFillGState) {                    currentFillGState = alpha;                    PdfGState gs = fillGState[alpha];                    if (gs == null) {                        gs = new PdfGState();                        gs.setFillOpacity((float)alpha / 255f);                        fillGState[alpha] = gs;                    }                    cb.setGState(gs);                }                cb.setColorFill(color);            }            else {                if (alpha != currentStrokeGState) {                    currentStrokeGState = alpha;                    PdfGState gs = strokeGState[alpha];                    if (gs == null) {                        gs = new PdfGState();                        gs.setStrokeOpacity((float)alpha / 255f);                        strokeGState[alpha] = gs;                    }                    cb.setGState(gs);                }                cb.setColorStroke(color);            }        }        else if (paint instanceof GradientPaint) {            GradientPaint gp = (GradientPaint)paint;            Point2D p1 = gp.getPoint1();            transform.transform(p1, p1);            Point2D p2 = gp.getPoint2();            transform.transform(p2, p2);            Color c1 = gp.getColor1();            Color c2 = gp.getColor2();            PdfShading shading = PdfShading.simpleAxial(cb.getPdfWriter(), (float)p1.getX(), normalizeY((float)p1.getY()), (float)p2.getX(), normalizeY((float)p2.getY()), c1, c2);            PdfShadingPattern pat = new PdfShadingPattern(shading);            if (fill)                cb.setShadingFill(pat);            else                cb.setShadingStroke(pat);        }        else if (paint instanceof TexturePaint) {            try {                TexturePaint tp = (TexturePaint)paint;                BufferedImage img = tp.getImage();                Rectangle2D rect = tp.getAnchorRect();                com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(img, null);                PdfPatternPainter pattern = cb.createPattern(image.getWidth(), image.getHeight());                AffineTransform inverse = this.normalizeMatrix();                inverse.translate(rect.getX(), rect.getY());                inverse.scale(rect.getWidth() / image.getWidth(), -rect.getHeight() / image.getHeight());                double[] mx = new double[6];                inverse.getMatrix(mx);                pattern.setPatternMatrix((float)mx[0], (float)mx[1], (float)mx[2], (float)mx[3], (float)mx[4], (float)mx[5]) ;                image.setAbsolutePosition(0,0);                pattern.addImage(image);                if (fill)                    cb.setPatternFill(pattern);                else                    cb.setPatternStroke(pattern);            } catch (Exception ex) {                if (fill)                    cb.setColorFill(Color.gray);                else                    cb.setColorStroke(Color.gray);            }        }        else {            try {                BufferedImage img = null;                int type = BufferedImage.TYPE_4BYTE_ABGR;                if (paint.getTransparency() == Transparency.OPAQUE) {                    type = BufferedImage.TYPE_3BYTE_BGR;                }                img = new BufferedImage((int)width, (int)height, type);                Graphics2D g = (Graphics2D)img.getGraphics();                g.transform(transform);                AffineTransform inv = transform.createInverse();                Shape fillRect = new Rectangle2D.Double(0,0,img.getWidth(),img.getHeight());                fillRect = inv.createTransformedShape(fillRect);                g.setPaint(paint);                g.fill(fillRect);                if (invert) {                    AffineTransform tx = new AffineTransform();                    tx.scale(1,-1);                    tx.translate(-xoffset,-yoffset);                    g.drawImage(img,tx,null);                }                g.dispose();                g = null;                com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(img, null);                PdfPatternPainter pattern = cb.createPattern(width, height);                image.setAbsolutePosition(0,0);                pattern.addImage(image);                if (fill)                    cb.setPatternFill(pattern);                else                    cb.setPatternStroke(pattern);            } catch (Exception ex) {                if (fill)                    cb.setColorFill(Color.gray);                else                    cb.setColorStroke(Color.gray);            }        }    }        private synchronized void waitForImage(java.awt.Image image) {        if (mediaTracker == null)            mediaTracker = new MediaTracker(new PdfGraphics2D.fakeComponent());        mediaTracker.addImage(image, 0);        try {            mediaTracker.waitForID(0);        }        catch (InterruptedException e) {            // empty on purpose        }        mediaTracker.removeImage(image);    }            static private class fakeComponent extends Component {		private static final long serialVersionUID = 6450197945596086638L;    }    /**     * @since 2.0.8     */    public static class HyperLinkKey extends RenderingHints.Key	{	 	public static final HyperLinkKey KEY_INSTANCE = new HyperLinkKey(9999);	 	public static final Object VALUE_HYPERLINKKEY_OFF = "0";	 			protected HyperLinkKey(int arg0) {			super(arg0);		}				public boolean isCompatibleValue(Object val)		{			return true;		}		public String toString()		{			return "HyperLinkKey";		}	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?