In PDFBox, how to change the origin (0,0) point of a PDRectangle object?

前端 未结 4 1089

The Situation:
In PDFBox, PDRectangle objects\' default origin (0,0) seems to be the lower-left corner of a page.

For example, the following code gives

4条回答
  •  无人及你
    2020-12-06 02:44

    The accepted answer created some problems for me. Also, text being mirrored and adjusting for that just didn't seem like the right solution for me. So here's what I came up with and so far, this has worked pretty smoothly.

    Solution (example available below):

    • Call the getAdjustedPoints(...) method with your original points as you are drawing on paper where x=0 and y=0 is top left corner.
    • This method will return float array (length 4) that can be used to draw rect
    • Array order is x, y, width and height. Just pass that addRect(...) method

    private float[] getAdjustedPoints(PDPage page, float x, float y, float width, float height) {
        float resizedWidth = getSizeFromInches(width);
        float resizedHeight = getSizeFromInches(height);
        return new float[] {
                getAdjustedX(page, getSizeFromInches(x)),
                getAdjustedY(page, getSizeFromInches(y)) - resizedHeight,
                resizedWidth, resizedHeight
        };
    }
    
    private float getSizeFromInches(float inches) {
        // 72 is POINTS_PER_INCH - it's defined in the PDRectangle class
        return inches * 72f;
    }
    
    private float getAdjustedX(PDPage page, float x) {
        return x + page.getCropBox().getLowerLeftX();
    }
    
    private float getAdjustedY(PDPage page, float y) {
        return -y + page.getCropBox().getUpperRightY();
    }
    

    Example:

    private PDPage drawPage1(PDDocument document) {
        PDPage page = new PDPage(PDRectangle.LETTER);
    
        try {
            // Gray Color Box
            PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, false, false);
            contentStream.setNonStrokingColor(Color.decode(MyColors.Gallery));
            float [] p1 = getAdjustedPoints(page, 0f, 0f, 8.5f, 1f);
            contentStream.addRect(p1[0], p1[1], p1[2], p1[3]);
            contentStream.fill();
    
            // Disco Color Box
            contentStream.setNonStrokingColor(Color.decode(MyColors.Disco));
            p1 = getAdjustedPoints(page, 4.5f, 1f, 4, 0.25f);
            contentStream.addRect(p1[0], p1[1], p1[2], p1[3]);
            contentStream.fill();
    
            contentStream.close();
        } catch (Exception e) { }
    
        return page;
    }
    

    As you can see, I've drawn 2 rectangle boxes.
    To draw this, I used the the following coordinates which assumes that x=0 and y=0 is top left.

    Gray Color Box: x=0, y=0, w=8.5, h=1
    Disco Color Box: x=4.5 y=1, w=4, h=0.25

    Here's an image of my result.

提交回复
热议问题