loonis
loonis

Reputation: 1487

Pdfbox : Draw image in rotated page

I have a simple A4 pdf document with a property /Rotate 90 : The original version of my pdf is landscape but printed portrait.

I am trying to draw a small image at the bottom left of the portait document.

Here is my code so far :

    File file = new File("rotated90.pdf");
    try (final PDDocument doc = PDDocument.load(file)) {
        PDPage page = doc.getPage(0);
        PDImageXObject image = PDImageXObject.createFromFile("image.jpg", doc);
        PDPageContentStream contents = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, false, true);
        contents.drawImage(image, 0, 0);
        contents.close();
        doc.save(new File("newpdf.pdf"));
}

Here is the end result : As you can see the image was placed at the top left (which was the 0,0 coordinate before rotation) and was not rotated.

s

I tried playing with drawImage(PDImageXObject image, Matrix matrix) without success.

Here is the orignal document pdf with 90° rotation

Upvotes: 2

Views: 2049

Answers (1)

Tilman Hausherr
Tilman Hausherr

Reputation: 18861

Here's a solution for a page that is rotated 90°:

PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
PDImageXObject image = ....
cs.saveGraphicsState();
cs.transform(Matrix.getRotateInstance(Math.toRadians(90), page.getCropBox().getWidth() + page.getCropBox().getLowerLeftX(), 0));
cs.drawImage(image, 0, 0);
cs.restoreGraphicsState();
cs.close();

If it is only the image, then you don't need the save/restore.

Solution for a page that is rotated 270°:

cs.transform(Matrix.getRotateInstance(Math.toRadians(270), 0, page.getCropBox().getHeight() + page.getCropBox().getLowerLeftY()));

For 180°:

cs.transform(Matrix.getRotateInstance(Math.toRadians(180), page.getCropBox().getWidth() + page.getCropBox().getLowerLeftX(), page.getCropBox().getHeight() + page.getCropBox().getLowerLeftY()));

Upvotes: 6

Related Questions