Example usage for org.apache.pdfbox.util Matrix setValue

List of usage examples for org.apache.pdfbox.util Matrix setValue

Introduction

In this page you can find the example usage for org.apache.pdfbox.util Matrix setValue.

Prototype

public void setValue(int row, int column, float value) 

Source Link

Document

This will set a value at a position.

Usage

From source file:PrintImageLocations.java

License:Apache License

protected void processOperator(PDFOperator operator, List arguments) throws IOException {
    String operation = operator.getOperation();
    if (INVOKE_OPERATOR.equals(operation)) {
        COSName objectName = (COSName) arguments.get(0);
        Map<String, PDXObject> xobjects = getResources().getXObjects();
        PDXObject xobject = (PDXObject) xobjects.get(objectName.getName());
        if (xobject instanceof PDXObjectImage) {
            PDXObjectImage image = (PDXObjectImage) xobject;
            PDPage page = getCurrentPage();
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();
            double pageHeight = page.getMediaBox().getHeight();
            flagimg = true;//from   w  w  w .  j a va 2s . c  o m
            System.out.println("*******************************************************************");
            System.out.println("Found image [" + objectName.getName() + "]");

            Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
            float yScaling = ctmNew.getYScale();
            float angle = (float) Math.acos(ctmNew.getValue(0, 0) / ctmNew.getXScale());
            if (ctmNew.getValue(0, 1) < 0 && ctmNew.getValue(1, 0) > 0) {
                angle = (-1) * angle;
            }
            ctmNew.setValue(2, 1, (float) (pageHeight - ctmNew.getYPosition() - Math.cos(angle) * yScaling));
            ctmNew.setValue(2, 0, (float) (ctmNew.getXPosition() - Math.sin(angle) * yScaling));
            // because of the moved 0,0-reference, we have to shear in the opposite direction
            ctmNew.setValue(0, 1, (-1) * ctmNew.getValue(0, 1));
            ctmNew.setValue(1, 0, (-1) * ctmNew.getValue(1, 0));
            AffineTransform ctmAT = ctmNew.createAffineTransform();
            ctmAT.scale(1f / imageWidth, 1f / imageHeight);

            float imageXScale = ctmNew.getXScale();
            float imageYScale = ctmNew.getYScale();
            System.out.println("position = " + ctmNew.getXPosition() + ", " + ctmNew.getYPosition());
            fl[i] = ctmNew.getYPosition();//important
            xxx[i] = ctmNew.getXPosition();
            System.out.println("y value is  " + fl[i]);

            // size in pixel
            System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");

            // size in page units
            System.out.println("size = " + imageXScale + ", " + imageYScale);
            // size in inches 
            imageXScale /= 72;
            imageYScale /= 72;
            System.out.println("size = " + imageXScale + "in, " + imageYScale + "in");
            // size in millimeter
            imageXScale *= 25.4;
            imageYScale *= 25.4;
            System.out.println("size = " + imageXScale + "mm, " + imageYScale + "mm");
            widtharray[i] = (imageXScale / 10);
            heightarray[i] = (imageYScale / 10);
            i++;
            System.out.println();
        } else if (xobject instanceof PDXObjectForm) {
            // save the graphics state
            getGraphicsStack().push((PDGraphicsState) getGraphicsState().clone());
            PDPage page = getCurrentPage();

            PDXObjectForm form = (PDXObjectForm) xobject;
            COSStream invoke = (COSStream) form.getCOSObject();
            PDResources pdResources = form.getResources();
            if (pdResources == null) {
                pdResources = page.findResources();
            }
            // if there is an optional form matrix, we have to
            // map the form space to the user space
            Matrix matrix = form.getMatrix();
            if (matrix != null) {
                Matrix xobjectCTM = matrix.multiply(getGraphicsState().getCurrentTransformationMatrix());
                getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
            }
            processSubStream(page, pdResources, invoke);

            // restore the graphics state
            setGraphicsState((PDGraphicsState) getGraphicsStack().pop());
        }

    } else {
        super.processOperator(operator, arguments);
    }
}

From source file:chiliad.parser.pdf.extractor.vectorgraphics.operator.BeginInlineImage.java

License:Apache License

/**
 * process : BI : begin inline image.//from  w w w . ja  v a2 s.com
 *
 * @param operator The operator that is being executed.
 * @param arguments List
 * @throws IOException If there is an error displaying the inline image.
 */
@Override
public void process(PDFOperator operator, List<COSBase> arguments) throws IOException {
    VectorGraphicsExtractor extractor = (VectorGraphicsExtractor) context;
    PDPage page = extractor.getPage();
    //begin inline image object
    ImageParameters params = operator.getImageParameters();
    PDInlinedImage image = new PDInlinedImage();
    image.setImageParameters(params);
    image.setImageData(operator.getImageData());
    if (params.isStencil()) {
        //TODO implement inline image stencil masks 
        LOG.warn("Stencil masks are not implemented, background may be incorrect");
    }
    BufferedImage awtImage = image.createImage(context.getColorSpaces());

    if (awtImage == null) {
        LOG.warn("BeginInlineImage.process(): createImage returned NULL");
        return;
    }
    int imageWidth = awtImage.getWidth();
    int imageHeight = awtImage.getHeight();
    double pageHeight = extractor.getPageSize().getHeight();

    Matrix ctm = extractor.getGraphicsState().getCurrentTransformationMatrix();
    int pageRotation = page.findRotation();

    AffineTransform ctmAT = ctm.createAffineTransform();
    ctmAT.scale(1f / imageWidth, 1f / imageHeight);
    Matrix rotationMatrix = new Matrix();
    rotationMatrix.setFromAffineTransform(ctmAT);
    // calculate the inverse rotation angle
    // scaleX = m00 = cos
    // shearX = m01 = -sin
    // tan = sin/cos
    double angle = Math.atan(ctmAT.getShearX() / ctmAT.getScaleX());
    Matrix translationMatrix = null;
    if (pageRotation == 0 || pageRotation == 180) {
        translationMatrix = Matrix.getTranslatingInstance((float) (Math.sin(angle) * ctm.getXScale()),
                (float) (pageHeight - 2 * ctm.getYPosition() - Math.cos(angle) * ctm.getYScale()));
    } else if (pageRotation == 90 || pageRotation == 270) {
        translationMatrix = Matrix.getTranslatingInstance((float) (Math.sin(angle) * ctm.getYScale()),
                (float) (pageHeight - 2 * ctm.getYPosition()));
    }
    rotationMatrix = rotationMatrix.multiply(translationMatrix);
    rotationMatrix.setValue(0, 1, (-1) * rotationMatrix.getValue(0, 1));
    rotationMatrix.setValue(1, 0, (-1) * rotationMatrix.getValue(1, 0));
    AffineTransform at = new AffineTransform(rotationMatrix.getValue(0, 0), rotationMatrix.getValue(0, 1),
            rotationMatrix.getValue(1, 0), rotationMatrix.getValue(1, 1), rotationMatrix.getValue(2, 0),
            rotationMatrix.getValue(2, 1));
    extractor.drawImage(awtImage, at);
}

From source file:chiliad.parser.pdf.extractor.vectorgraphics.operator.Invoke.java

License:Apache License

/**
 * process : Do : Paint the specified XObject (section 4.7).
 *
 * @param operator The operator that is being executed.
 * @param arguments List/*from   w  ww. j  a  va2 s .  c  om*/
 * @throws IOException If there is an error invoking the sub object.
 */
@Override
public void process(PDFOperator operator, List<COSBase> arguments) throws IOException {
    VectorGraphicsExtractor extractor = (VectorGraphicsExtractor) context;

    PDPage page = extractor.getPage();
    COSName objectName = (COSName) arguments.get(0);
    Map<String, PDXObject> xobjects = extractor.getResources().getXObjects();
    PDXObject xobject = (PDXObject) xobjects.get(objectName.getName());
    if (xobject == null) {
        LOG.warn("Can't find the XObject for '" + objectName.getName() + "'");
    } else if (xobject instanceof PDXObjectImage) {
        PDXObjectImage image = (PDXObjectImage) xobject;
        try {
            if (image.getImageMask()) {
                // set the current non stroking colorstate, so that it can
                // be used to create a stencil masked image
                image.setStencilColor(extractor.getGraphicsState().getNonStrokingColor());
            }
            BufferedImage awtImage = image.getRGBImage();
            if (awtImage == null) {
                LOG.warn("getRGBImage returned NULL");
                return;//TODO PKOCH
            }
            int imageWidth = awtImage.getWidth();
            int imageHeight = awtImage.getHeight();
            double pageHeight = extractor.getPageSize().getHeight();

            LOG.debug("imageWidth: " + imageWidth + "\t\timageHeight: " + imageHeight);

            Matrix ctm = extractor.getGraphicsState().getCurrentTransformationMatrix();
            float yScaling = ctm.getYScale();
            float angle = (float) Math.acos(ctm.getValue(0, 0) / ctm.getXScale());
            if (ctm.getValue(0, 1) < 0 && ctm.getValue(1, 0) > 0) {
                angle = (-1) * angle;
            }
            ctm.setValue(2, 1, (float) (pageHeight - ctm.getYPosition() - Math.cos(angle) * yScaling));
            ctm.setValue(2, 0, (float) (ctm.getXPosition() - Math.sin(angle) * yScaling));
            // because of the moved 0,0-reference, we have to shear in the opposite direction
            ctm.setValue(0, 1, (-1) * ctm.getValue(0, 1));
            ctm.setValue(1, 0, (-1) * ctm.getValue(1, 0));
            AffineTransform ctmAT = ctm.createAffineTransform();
            ctmAT.scale(1f / imageWidth, 1f / imageHeight);
            extractor.drawImage(awtImage, ctmAT);
        } catch (Exception e) {
            LOG.error(e, e);
        }
    } else if (xobject instanceof PDXObjectForm) {
        // save the graphics state
        context.getGraphicsStack().push((PDGraphicsState) context.getGraphicsState().clone());

        PDXObjectForm form = (PDXObjectForm) xobject;
        COSStream formContentstream = form.getCOSStream();
        // find some optional resources, instead of using the current resources
        PDResources pdResources = form.getResources();
        // if there is an optional form matrix, we have to map the form space to the user space
        Matrix matrix = form.getMatrix();
        if (matrix != null) {
            Matrix xobjectCTM = matrix.multiply(context.getGraphicsState().getCurrentTransformationMatrix());
            context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
        }
        if (form.getBBox() != null) {
            PDGraphicsState graphicsState = context.getGraphicsState();
            PDRectangle bBox = form.getBBox();

            float x1 = bBox.getLowerLeftX();
            float y1 = bBox.getLowerLeftY();
            float x2 = bBox.getUpperRightX();
            float y2 = bBox.getUpperRightY();

            Point2D p0 = extractor.transformedPoint(x1, y1);
            Point2D p1 = extractor.transformedPoint(x2, y1);
            Point2D p2 = extractor.transformedPoint(x2, y2);
            Point2D p3 = extractor.transformedPoint(x1, y2);

            GeneralPath bboxPath = new GeneralPath();
            bboxPath.moveTo((float) p0.getX(), (float) p0.getY());
            bboxPath.lineTo((float) p1.getX(), (float) p1.getY());
            bboxPath.lineTo((float) p2.getX(), (float) p2.getY());
            bboxPath.lineTo((float) p3.getX(), (float) p3.getY());
            bboxPath.closePath();

            Area resultClippingArea = new Area(graphicsState.getCurrentClippingPath());
            Area newArea = new Area(bboxPath);
            resultClippingArea.intersect(newArea);

            graphicsState.setCurrentClippingPath(resultClippingArea);
        }
        getContext().processSubStream(page, pdResources, formContentstream);

        // restore the graphics state
        context.setGraphicsState((PDGraphicsState) context.getGraphicsStack().pop());
    }
}

From source file:edu.umass.cs.iesl.pdf2meta.cli.extract.pdfbox.pagedrawer.BeginInlineImage.java

License:Apache License

/**
 * process : BI : begin inline image.//from w  w w .jav a2 s  .  c  o m
 * @param operator The operator that is being executed.
 * @param arguments List
 * @throws java.io.IOException If there is an error displaying the inline image.
 */
public void process(PDFOperator operator, List<COSBase> arguments) throws IOException {
    GraphicsAwarePDFStreamEngine drawer = (GraphicsAwarePDFStreamEngine) context;

    PDPage page = drawer.getPage();
    //begin inline image object
    ImageParameters params = operator.getImageParameters();
    PDInlinedImage image = new PDInlinedImage();
    image.setImageParameters(params);
    image.setImageData(operator.getImageData());
    BufferedImage awtImage = image.createImage(context.getColorSpaces());

    if (awtImage == null) {
        log.warn("BeginInlineImage.process(): createImage returned NULL");
        return;
    }
    int imageWidth = awtImage.getWidth();
    int imageHeight = awtImage.getHeight();
    double pageHeight = drawer.getPageSize().getHeight();

    Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
    int pageRotation = page.findRotation();

    AffineTransform ctmAT = ctm.createAffineTransform();
    ctmAT.scale(1f / imageWidth, 1f / imageHeight);
    Matrix rotationMatrix = new Matrix();
    rotationMatrix.setFromAffineTransform(ctmAT);
    // calculate the inverse rotation angle
    // scaleX = m00 = cos
    // shearX = m01 = -sin
    // tan = sin/cos
    double angle = Math.atan(ctmAT.getShearX() / ctmAT.getScaleX());
    Matrix translationMatrix = null;
    if (pageRotation == 0 || pageRotation == 180) {
        translationMatrix = Matrix.getTranslatingInstance((float) (Math.sin(angle) * ctm.getXScale()),
                (float) (pageHeight - 2 * ctm.getYPosition() - Math.cos(angle) * ctm.getYScale()));
    } else if (pageRotation == 90 || pageRotation == 270) {
        translationMatrix = Matrix.getTranslatingInstance((float) (Math.sin(angle) * ctm.getYScale()),
                (float) (pageHeight - 2 * ctm.getYPosition()));
    }
    rotationMatrix = rotationMatrix.multiply(translationMatrix);
    rotationMatrix.setValue(0, 1, (-1) * rotationMatrix.getValue(0, 1));
    rotationMatrix.setValue(1, 0, (-1) * rotationMatrix.getValue(1, 0));
    AffineTransform at = new AffineTransform(rotationMatrix.getValue(0, 0), rotationMatrix.getValue(0, 1),
            rotationMatrix.getValue(1, 0), rotationMatrix.getValue(1, 1), rotationMatrix.getValue(2, 0),
            rotationMatrix.getValue(2, 1));
    drawer.drawImage(awtImage, at);
}

From source file:edu.umass.cs.iesl.pdf2meta.cli.extract.pdfbox.pagedrawer.Invoke.java

License:Apache License

/**
 * process : Do : Paint the specified XObject (section 4.7).
 * @param operator The operator that is being executed.
 * @param arguments List/*  w  w w . j  a va  2 s.com*/
 * @throws java.io.IOException If there is an error invoking the sub object.
 */
public void process(PDFOperator operator, List<COSBase> arguments) throws IOException {
    GraphicsAwarePDFStreamEngine drawer = (GraphicsAwarePDFStreamEngine) context;
    PDPage page = drawer.getPage();
    COSName objectName = (COSName) arguments.get(0);
    Map xobjects = drawer.getResources().getXObjects();
    PDXObject xobject = (PDXObject) xobjects.get(objectName.getName());
    if (xobject == null) {
        log.warn("Can't find the XObject for '" + objectName.getName() + "'");
    } else if (xobject instanceof PDXObjectImage) {
        PDXObjectImage image = (PDXObjectImage) xobject;
        try {
            image.setGraphicsState(drawer.getGraphicsState());
            BufferedImage awtImage = image.getRGBImage();
            if (awtImage == null) {
                log.warn("getRGBImage returned NULL");
                return;//TODO PKOCH
            }
            int imageWidth = awtImage.getWidth();
            int imageHeight = awtImage.getHeight();
            double pageHeight = drawer.getPageSize().getHeight();

            log.debug("imageWidth: " + imageWidth + "\t\timageHeight: " + imageHeight);

            Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
            float yScaling = ctm.getYScale();
            float angle = (float) Math.acos(ctm.getValue(0, 0) / ctm.getXScale());
            if (ctm.getValue(0, 1) < 0 && ctm.getValue(1, 0) > 0)
                angle = (-1) * angle;
            ctm.setValue(2, 1, (float) (pageHeight - ctm.getYPosition() - Math.cos(angle) * yScaling));
            ctm.setValue(2, 0, (float) (ctm.getXPosition() - Math.sin(angle) * yScaling));
            // because of the moved 0,0-reference, we have to shear in the opposite direction
            ctm.setValue(0, 1, (-1) * ctm.getValue(0, 1));
            ctm.setValue(1, 0, (-1) * ctm.getValue(1, 0));
            AffineTransform ctmAT = ctm.createAffineTransform();
            ctmAT.scale(1f / imageWidth, 1f / imageHeight);
            drawer.drawImage(awtImage, ctmAT);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e, e);
        }
    } else if (xobject instanceof PDXObjectForm) {
        // save the graphics state
        context.getGraphicsStack().push((PDGraphicsState) context.getGraphicsState().clone());

        PDXObjectForm form = (PDXObjectForm) xobject;
        COSStream invoke = (COSStream) form.getCOSObject();
        PDResources pdResources = form.getResources();
        if (pdResources == null) {
            pdResources = page.findResources();
        }
        // if there is an optional form matrix, we have to
        // map the form space to the user space
        Matrix matrix = form.getMatrix();
        if (matrix != null) {
            Matrix xobjectCTM = matrix.multiply(context.getGraphicsState().getCurrentTransformationMatrix());
            context.getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
        }
        getContext().processSubStream(page, pdResources, invoke);

        // restore the graphics state
        context.setGraphicsState((PDGraphicsState) context.getGraphicsStack().pop());
    }
}

From source file:function.PrintImageLocations.java

License:Apache License

/**
 * This is used to handle an operation.//from  w  w w.  j a  v  a2s  .c  o  m
 *
 * @param operator The operation to perform.
 * @param arguments The list of arguments.
 *
 * @throws IOException If there is an error processing the operation.
 */
protected void processOperator(PDFOperator operator, List arguments) throws IOException {
    String operation = operator.getOperation();
    if (INVOKE_OPERATOR.equals(operation)) {
        COSName objectName = (COSName) arguments.get(0);
        Map<String, PDXObject> xobjects = getResources().getXObjects();
        PDXObject xobject = (PDXObject) xobjects.get(objectName.getName());
        if (xobject instanceof PDXObjectImage) {
            PDXObjectImage image = (PDXObjectImage) xobject;
            PDPage page = getCurrentPage();
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();
            double pageHeight = page.getMediaBox().getHeight();
            //System.out.println("*******************************************************************");
            System.out.println("Found image [" + objectName.getName() + "]");

            Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
            float yScaling = ctmNew.getYScale();
            float angle = (float) Math.acos(ctmNew.getValue(0, 0) / ctmNew.getXScale());
            if (ctmNew.getValue(0, 1) < 0 && ctmNew.getValue(1, 0) > 0) {
                angle = (-1) * angle;
            }
            ctmNew.setValue(2, 1, (float) (pageHeight - ctmNew.getYPosition() - Math.cos(angle) * yScaling));
            ctmNew.setValue(2, 0, (float) (ctmNew.getXPosition() - Math.sin(angle) * yScaling));
            // because of the moved 0,0-reference, we have to shear in the opposite direction
            ctmNew.setValue(0, 1, (-1) * ctmNew.getValue(0, 1));
            ctmNew.setValue(1, 0, (-1) * ctmNew.getValue(1, 0));
            AffineTransform ctmAT = ctmNew.createAffineTransform();
            ctmAT.scale(1f / imageWidth, 1f / imageHeight);

            float imageXScale = ctmNew.getXScale();
            float imageYScale = ctmNew.getYScale();
            System.out.println("position = " + ctmNew.getXPosition() + ", " + ctmNew.getYPosition());
            // size in pixel
            System.out.println("size = " + imageWidth + "px, " + imageHeight + "px");
            // size in page units
            System.out.println("size = " + imageXScale + ", " + imageYScale);
            // size in inches 
            imageXScale /= 72;
            imageYScale /= 72;
            System.out.println("size = " + imageXScale + "in, " + imageYScale + "in");
            // size in millimeter
            imageXScale *= 25.4;
            imageYScale *= 25.4;
            System.out.println("size = " + imageXScale + "mm, " + imageYScale + "mm");
            System.out.println();
            System.out.printf("dpi  = %.0f dpi (X), %.0f dpi (Y) %n",
                    image.getWidth() * 72 / ctmNew.getXScale(), image.getHeight() * 72 / ctmNew.getYScale());

        } else if (xobject instanceof PDXObjectForm) {
            // save the graphics state
            getGraphicsStack().push((PDGraphicsState) getGraphicsState().clone());
            PDPage page = getCurrentPage();

            PDXObjectForm form = (PDXObjectForm) xobject;
            COSStream invoke = (COSStream) form.getCOSObject();
            PDResources pdResources = form.getResources();
            if (pdResources == null) {
                pdResources = page.findResources();
            }
            // if there is an optional form matrix, we have to
            // map the form space to the user space
            Matrix matrix = form.getMatrix();
            if (matrix != null) {
                Matrix xobjectCTM = matrix.multiply(getGraphicsState().getCurrentTransformationMatrix());
                getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
            }
            processSubStream(page, pdResources, invoke);

            // restore the graphics state
            setGraphicsState((PDGraphicsState) getGraphicsStack().pop());
        }

    } else {
        super.processOperator(operator, arguments);
    }
}

From source file:net.timendum.pdf.Images2HTML.java

License:Open Source License

@Override
protected void processOperator(PDFOperator operator, List arguments) throws IOException {
    String operation = operator.getOperation();
    if (INVOKE_OPERATOR.equals(operation)) {
        COSName objectName = (COSName) arguments.get(0);
        Map<String, PDXObject> xobjects = getResources().getXObjects();
        PDXObject xobject = xobjects.get(objectName.getName());
        if (xobject instanceof PDXObjectImage) {
            PDXObjectImage image = (PDXObjectImage) xobject;
            PDPage page = getCurrentPage();
            int imageWidth = image.getWidth();
            int imageHeight = image.getHeight();
            double pageHeight = page.getMediaBox().getHeight();

            Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
            float yScaling = ctmNew.getYScale();
            float angle = (float) Math.acos(ctmNew.getValue(0, 0) / ctmNew.getXScale());
            if (ctmNew.getValue(0, 1) < 0 && ctmNew.getValue(1, 0) > 0) {
                angle = (-1) * angle;//from w w w. j av a 2s . c  o m
            }
            ctmNew.setValue(2, 1, (float) (pageHeight - ctmNew.getYPosition() - Math.cos(angle) * yScaling));
            ctmNew.setValue(2, 0, (float) (ctmNew.getXPosition() - Math.sin(angle) * yScaling));
            // because of the moved 0,0-reference, we have to shear in the opposite direction
            ctmNew.setValue(0, 1, (-1) * ctmNew.getValue(0, 1));
            ctmNew.setValue(1, 0, (-1) * ctmNew.getValue(1, 0));
            AffineTransform ctmAT = ctmNew.createAffineTransform();
            ctmAT.scale(1f / imageWidth, 1f / imageHeight);

            Image entry = new Image();
            entry.x = ctmNew.getXPosition();
            entry.image = image;
            entry.name = objectName.getName();
            images.put(page, ctmNew.getYPosition(), entry);

        } else if (xobject instanceof PDXObjectForm) {
            // save the graphics state
            getGraphicsStack().push((PDGraphicsState) getGraphicsState().clone());
            PDPage page = getCurrentPage();

            PDXObjectForm form = (PDXObjectForm) xobject;
            COSStream invoke = (COSStream) form.getCOSObject();
            PDResources pdResources = form.getResources();
            if (pdResources == null) {
                pdResources = page.findResources();
            }
            // if there is an optional form matrix, we have to
            // map the form space to the user space
            Matrix matrix = form.getMatrix();
            if (matrix != null) {
                Matrix xobjectCTM = matrix.multiply(getGraphicsState().getCurrentTransformationMatrix());
                getGraphicsState().setCurrentTransformationMatrix(xobjectCTM);
            }
            processSubStream(page, pdResources, invoke);

            // restore the graphics state
            setGraphicsState(getGraphicsStack().pop());
        }

    } else {
        super.processOperator(operator, arguments);
    }
}

From source file:org.apache.pdflens.views.pagesview.PageDrawer.java

License:Apache License

/**
 * You should override this method if you want to perform an action when a
 * text is being processed. /*from w  w w .j av a  2s .co m*/
 *
 * @param text The text to process 
 */
protected void processTextPosition(TextPosition text) {
    //should use colorspaces for the font color but for now assume that
    //the font color is black
    try {
        if (this.getGraphicsState().getTextState().getRenderingMode() == PDTextState.RENDERING_MODE_FILL_TEXT) {
            graphics.setColor(this.getGraphicsState().getNonStrokingColor().getJavaColor());
        } else if (this.getGraphicsState().getTextState()
                .getRenderingMode() == PDTextState.RENDERING_MODE_STROKE_TEXT) {
            graphics.setColor(this.getGraphicsState().getStrokingColor().getJavaColor());
        } else {
            // TODO : need to implement....
            log.warn("Unsupported RenderingMode " + this.getGraphicsState().getTextState().getRenderingMode()
                    + " in PageDrawer.processTextPosition()." + " Using RenderingMode "
                    + PDTextState.RENDERING_MODE_FILL_TEXT + " instead");
            graphics.setColor(this.getGraphicsState().getNonStrokingColor().getJavaColor());
        }
        PDFont font = text.getFont();

        Matrix textPos = text.getTextPos().copy();
        float x = textPos.getXPosition();
        // the 0,0-reference has to be moved from the lower left (PDF) to the upper left (AWT-graphics)
        float y = pageSize.height - textPos.getYPosition();
        // Set translation to 0,0. We only need the scaling and shearing
        textPos.setValue(2, 0, 0);
        textPos.setValue(2, 1, 0);
        // because of the moved 0,0-reference, we have to shear in the opposite direction
        textPos.setValue(0, 1, (-1) * textPos.getValue(0, 1));
        textPos.setValue(1, 0, (-1) * textPos.getValue(1, 0));
        AffineTransform at = textPos.createAffineTransform();
        graphics.setClip(getGraphicsState().getCurrentClippingPath());
        font.drawString(text.getCharacter(), graphics, text.getFontSize(), at, x, y);
    } catch (IOException io) {
        io.printStackTrace();
    }
}

From source file:org.elacin.pdfextract.datasource.pdfbox.PDFBoxIntegration.java

License:Apache License

/**
 * Old version/*  www . j a v a  2  s .  c  o  m*/
 */
public void processEncodedText(@NotNull byte[] string) throws IOException {

    /*
     *  Note on variable names.  There are three different units being used
     *     in this code.  Character sizes are given in glyph units, text locations
     *     are initially given in text units, and we want to save the data in
     *     display units. The variable names should end with Text or Disp to
     *     represent if the values are in text or disp units (no glyph units are saved).
     */
    final float fontSizeText = getGraphicsState().getTextState().getFontSize();
    final float horizontalScalingText = getGraphicsState().getTextState().getHorizontalScalingPercent() / 100f;

    // float verticalScalingText = horizontalScaling;//not sure if this is right but what else to
    // do???
    final float riseText = getGraphicsState().getTextState().getRise();
    final float wordSpacingText = getGraphicsState().getTextState().getWordSpacing();
    final float characterSpacingText = getGraphicsState().getTextState().getCharacterSpacing();

    /*
     *  We won't know the actual number of characters until
     * we process the byte data(could be two bytes each) but
     * it won't ever be more than string.length*2(there are some cases
     * were a single byte will result in two output characters "fi"
     */
    final PDFont font = getGraphicsState().getTextState().getFont();

    /*
     *  This will typically be 1000 but in the case of a type3 font this might be a different
     * number
     */
    final float glyphSpaceToTextSpaceFactor;

    if (font instanceof PDType3Font) {
        PDMatrix fontMatrix = font.getFontMatrix();
        float fontMatrixXScaling = fontMatrix.getValue(0, 0);

        glyphSpaceToTextSpaceFactor = 1.0f / fontMatrixXScaling;
    } else {
        glyphSpaceToTextSpaceFactor = /* 1.0f / */ 1000f;
    }

    float spaceWidthText = 0.0F;

    try {
        spaceWidthText = (font.getFontWidth(SPACE_BYTES, 0, 1) / glyphSpaceToTextSpaceFactor);
    } catch (Throwable exception) {
        log.warn(exception, exception);
    }

    if (spaceWidthText == 0.0F) {
        spaceWidthText = (font.getAverageFontWidth() / glyphSpaceToTextSpaceFactor);
        spaceWidthText *= .80f;
    }

    /* Convert textMatrix to display units */
    final Matrix initialMatrix = new Matrix();

    initialMatrix.setValue(0, 0, 1.0F);
    initialMatrix.setValue(0, 1, 0.0F);
    initialMatrix.setValue(0, 2, 0.0F);
    initialMatrix.setValue(1, 0, 0.0F);
    initialMatrix.setValue(1, 1, 1.0F);
    initialMatrix.setValue(1, 2, 0.0F);
    initialMatrix.setValue(2, 0, 0.0F);
    initialMatrix.setValue(2, 1, riseText);
    initialMatrix.setValue(2, 2, 1.0F);

    final Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
    final Matrix dispMatrix = initialMatrix.multiply(ctm);
    Matrix textMatrixStDisp = getTextMatrix().multiply(dispMatrix);
    final float xScaleDisp = textMatrixStDisp.getXScale();
    final float yScaleDisp = textMatrixStDisp.getYScale();
    final float spaceWidthDisp = spaceWidthText * xScaleDisp * fontSizeText;
    final float wordSpacingDisp = wordSpacingText * xScaleDisp * fontSizeText;
    float maxVerticalDisplacementText = 0.0F;
    StringBuilder characterBuffer = new StringBuilder(string.length);
    int codeLength = 1;

    for (int i = 0; i < string.length; i += codeLength) {

        // Decode the value to a Unicode character
        codeLength = 1;

        String c = font.encode(string, i, codeLength);

        if ((c == null) && (i + 1 < string.length)) {

            // maybe a multibyte encoding
            codeLength++;
            c = font.encode(string, i, codeLength);
        }

        c = inspectFontEncoding(c);

        // todo, handle horizontal displacement
        // get the width and height of this character in text units
        float fontWidth = font.getFontWidth(string, i, codeLength) * 0.95f;

        if (fontWidth == 0.0f) {
            fontWidth = spaceWidthDisp;
        }

        float characterHorizontalDisplacementText = (fontWidth / glyphSpaceToTextSpaceFactor);

        maxVerticalDisplacementText = Math.max(maxVerticalDisplacementText,
                font.getFontHeight(string, i, codeLength) / glyphSpaceToTextSpaceFactor);

        if (maxVerticalDisplacementText <= 0.0f) {
            maxVerticalDisplacementText = font.getFontBoundingBox().getHeight() / glyphSpaceToTextSpaceFactor;
        }

        /**
         * PDF Spec - 5.5.2 Word Spacing
         *
         * Word spacing works the same was as character spacing, but applies
         * only to the space character, code 32.
         *
         * Note: Word spacing is applied to every occurrence of the single-byte
         * character code 32 in a string.  This can occur when using a simple
         * font or a composite font that defines code 32 as a single-byte code.
         * It does not apply to occurrences of the byte value 32 in multiple-byte
         * codes.
         *
         * RDD - My interpretation of this is that only character code 32's that
         * encode to spaces should have word spacing applied.  Cases have been
         * observed where a font has a space character with a character code
         * other than 32, and where word spacing (Tw) was used.  In these cases,
         * applying word spacing to either the non-32 space or to the character
         * code 32 non-space resulted in errors consistent with this interpretation.
         */
        float spacingText = characterSpacingText;

        if ((string[i] == (byte) 0x20) && (codeLength == 1)) {
            spacingText += wordSpacingText;
        }

        /*
         *  The text matrix gets updated after each glyph is placed.  The updated
         *          version will have the X and Y coordinates for the next glyph.
         */
        Matrix glyphMatrixStDisp = getTextMatrix().multiply(dispMatrix);

        // The adjustment will always be zero.  The adjustment as shown in the
        // TJ operator will be handled separately.
        float adjustment = 0.0F;

        // TODO : tx should be set for horizontal text and ty for vertical text
        // which seems to be specified in the font (not the direction in the matrix).
        float tx = ((characterHorizontalDisplacementText - adjustment / glyphSpaceToTextSpaceFactor)
                * fontSizeText) * horizontalScalingText;
        Matrix td = new Matrix();

        td.setValue(2, 0, tx);

        float ty = 0.0F;

        td.setValue(2, 1, ty);
        setTextMatrix(td.multiply(getTextMatrix()));

        Matrix glyphMatrixEndDisp = getTextMatrix().multiply(dispMatrix);
        float sx = spacingText * horizontalScalingText;
        Matrix sd = new Matrix();

        sd.setValue(2, 0, sx);

        float sy = 0.0F;

        sd.setValue(2, 1, sy);
        setTextMatrix(sd.multiply(getTextMatrix()));

        float widthText = glyphMatrixEndDisp.getXPosition() - glyphMatrixStDisp.getXPosition();

        characterBuffer.append(c);

        Matrix textMatrixEndDisp = glyphMatrixEndDisp;
        float totalVerticalDisplacementDisp = maxVerticalDisplacementText * fontSizeText * yScaleDisp;

        try {
            final ETextPosition text = new ETextPosition(page, textMatrixStDisp, textMatrixEndDisp,
                    totalVerticalDisplacementDisp, new float[] { widthText }, spaceWidthDisp,
                    characterBuffer.toString(), font, fontSizeText,
                    (int) (fontSizeText * getTextMatrix().getXScale()), wordSpacingDisp);

            correctPosition(font, string, i, c, fontSizeText, glyphSpaceToTextSpaceFactor,
                    horizontalScalingText, codeLength, text);
            processTextPosition(text);
        } catch (Exception e) {
            log.warn("LOG00570:Error adding '" + characterBuffer + "': " + e.getMessage());
        }

        textMatrixStDisp = getTextMatrix().multiply(dispMatrix);
        characterBuffer.setLength(0);
    }
}

From source file:org.fit.pdfdom.PDFBoxTree.java

License:Open Source License

/**
 * Transforms a length according to the current transformation matrix.
 *//*from   w  w w .j  a va 2 s.c  o  m*/
protected float transformLength(float w) {
    Matrix ctm = getGraphicsState().getCurrentTransformationMatrix();
    Matrix m = new Matrix();
    m.setValue(2, 0, w);
    return m.multiply(ctm).getTranslateX();
}