Использование PdfStamper для добавления изображения с помощью AffineTransform

Я использую PdfStamper getOverContent(), поэтому я могу добавить изображение в выходной файл PDF, используя тип AffineTransform Identity.

    PdfContentByte content = stamper.getOverContent(1);
    data.image.setAbsolutePosition(desc.X,desc.Y);
    content.addImage(data.image,desc.transform);
    //content.addImage(data.image);

если я использую закомментированную строку без преобразования, она отлично работает, добавляя изображение в сгенерированный PDF-файл, но с AffineTransform (setToIdentity()) оно не отображается.

может ли кто-нибудь помочь мне с этим? Я намерен использовать более сложное преобразование, но Identity должна работать в первую очередь...


РЕДАКТИРОВАТЬ (скопировано из неверного ответа)

Я удалил вызов setAbsolutePosition и использовал setToIdentity() как единственное преобразование, а изображение не отображается... Затем добавил setToTranslation (X, Y), где X и Y - те же значения, которые использовались в успешном случае, когда я делаю НЕ задавайте преобразование в качестве второго параметра, и при этом оно НЕ показывает изображение. Есть ли пример с AffineTransform в качестве параметра для вызова PdfContentByte addImage() с использованием AffineTransform в качестве параметра? Я купил вашу книгу, но не нашел ни одной.


person Mário de Sá Vera    schedule 06.12.2015    source источник
comment
Как выглядит ваш transform? Возможно, он поворачивает изображение за пределы видимой области страницы. Кроме того: насколько я знаю, вы не можете комбинировать setAbsolutePosition() (удобный метод, чтобы вам не нужно было определять перевод) с добавлением документа, определяющего ваше собственное преобразование.   -  person Bruno Lowagie    schedule 06.12.2015
comment
Я удалил вызов setAbsolutePosition и использовал setToIdentity() как единственное преобразование, и изображение не отображается... Затем добавил setToTranslation(X,Y), где X и Y - те же значения, которые использовались в успешном случае, когда я делаю НЕ задавайте преобразование в качестве второго параметра, и при этом оно НЕ показывает изображение. Есть ли пример с AffineTransform в качестве параметра для вызова PdfContentByte addImage() с использованием AffineTransform в качестве параметра? Я купил вашу книгу, но не смог найти ни одной.   -  person Mário de Sá Vera    schedule 07.12.2015


Ответы (1)


Я изучил вашу проблему и почти уверен, что ваше изображение будет добавлено. Однако: вы не можете его увидеть, потому что размер изображения составляет 1 пользовательская единица на 1 пользовательскую единицу.

Я сделал пример, чтобы показать вам, как решить эту проблему: AddImageAffineTransform

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    Image image = Image.getInstance(IMG);
    AffineTransform at = AffineTransform.getTranslateInstance(36, 300);
    at.concatenate(AffineTransform.getScaleInstance(image.getScaledWidth(), image.getScaledHeight()));
    PdfContentByte canvas = stamper.getOverContent(1);
    canvas.addImage(image, at);
    stamper.close();
    reader.close();
}

В этом примере я начинаю с перевода: 36 пользовательских единиц от левой границы и 300 пользовательских единиц от нижней. Если бы я добавил изображение с помощью этого преобразования, я бы добавил изображение в этих координатах, но оно было бы слишком маленьким, чтобы увидеть его невооруженным глазом.

Чтобы убедиться, что изображение видно, я объединяю преобразование масштаба, масштабируя изображение до его ширины в направлении X и до его высоты в направлении Y.

person Bruno Lowagie    schedule 08.12.2015
comment
Дорогой Бруно, я ценю вашу помощь. Теперь, когда я следовал вашим указаниям, он отлично работает. Честно говоря, для меня нет смысла требовать масштабирования фреймворка iText для правильной визуализации изображения, но еще раз я благодарю вас за ваше время и хотел бы больше сотрудничать с вашими усилиями, если это звучит как правильно для вас. заботиться. - person Mário de Sá Vera; 08.12.2015