Нарисуйте изображение в средней позиции с помощью pdfbox Java

shanky спросил: 28 марта 2018 в 04:10 в: java

Я пытаюсь добавить изображение в центр pdf, используя pdfbox. Ниже мой код, но я не могу получить правильную позицию изображения в формате pdf. Я выполнил следующую ссылку В PDFBox, как изменить исходную точку (0,0) объекта PDRectangle? , чтобы получить правильное положение, но неподвижное изображение отключено от положения средней точки

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.util.Matrix;public class imageAppend {
     public static void main (String[] args){            File file = new File("...pdf file location");
            PDDocument doc = null;
            try 
            {
                doc = PDDocument.load(file);
                PDImageXObject pdImage = PDImageXObject.createFromFile("image file location", doc);                PDPage page = doc.getPage(0);
                PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true);               float x_pos = page.getCropBox().getWidth();
               float y_pos = page.getCropBox().getHeight();                float x_adjusted = ( x_pos - w ) / 2;
                float y_adjusted = ( y_pos - h ) / 2;                Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
            contentStream.transform(mt);
            contentStream.drawImage(pdImage, x_adjusted, y_adjusted, w, h);                doc.save("new pdf file location");
                doc.close();            } catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
}

1 ответ

Есть решение
mkl ответил: 31 марта 2018 в 07:27

Я воспроизвёл вашу проблему, с моими тестовыми данными (к сожалению, вы не поделились своими данными), я получаю

В общем случае вы также должны добавить координаты нижнего левого угла поля обрезки в свои x_adjusted и y_adjusted

Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
contentStream.transform(mt);

(метод тестирования AddImage testImageAppendNoMirror)