Как добавить текст к изображению?

В моем проекте я использую iText для создания PDF-документа.

Предположим, что высота страницы составляет 500pt (1 единица пользователя = 1 балл) и что я пишу текст на страницу, а затем изображение.

Если содержание и изображение требуют менее 450pt, текст предшествует изображению. Если содержимое и изображение превышают 450pt, текст пересылается на следующую страницу.

Мой вопрос: как я могу получить оставшееся свободное пространство перед написанием изображения?

Прежде всего: при добавлении текста и изображений на страницу iText иногда меняет порядок текстового контента и изображения. Вы можете избежать этого, используя:

writer.setStrictImageSequence(true); 

Если вы хотите узнать текущую позицию «курсора», вы можете использовать метод getVerticalPosition() . К сожалению, этот метод не очень изящный: для него требуется булевский параметр, который добавит новую строку (если это true ) или даст вам позицию в текущей строке (если false ).

Я не понимаю, почему вы хотите получить вертикальное положение. Это потому, что вы хотите иметь заголовок, сопровождаемый изображением, и хотите, чтобы надпись и изображение находились на одной странице?

В этом случае вы можете поместить свой текст и изображения внутри ячейки таблицы и проинструктировать iText не разделять строки. В этом случае iText будет пересылать как текст, так и изображение в правильном порядке на следующую страницу, если содержимое не соответствует текущей странице.

Обновить:

Исходя из дополнительной информации, добавленной в комментариях, теперь ясно, что OP хочет добавить изображения с водяными знаками.

Существует два подхода к достижению этого, в зависимости от фактического требования.

Подход 1:

Первый подход объясняется в примере WatermarkedImages1 . В этом примере мы создаем PdfTemplate к которому мы добавляем изображение, а также некоторый текст, написанный поверх этого изображения. Затем мы можем обернуть этот PdfTemplate внутри изображения и добавить это изображение вместе с его водяным знаком с помощью одного document.add() .

Это метод, который выполняет всю магию:

 public Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException { float width = img.getScaledWidth(); float height = img.getScaledHeight(); PdfTemplate template = cb.createTemplate(width, height); template.addImage(img, width, 0, 0, height, 0, 0); ColumnText.showTextAligned(template, Element.ALIGN_CENTER, new Phrase(watermark, FONT), width / 2, height / 2, 30); return Image.getInstance(template); } 

Вот как мы добавляем изображения:

 PdfContentByte cb = writer.getDirectContentUnder(); document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE1), "Bruno")); document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE2), "Dog")); document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE3), "Fox")); Image img = Image.getInstance(IMAGE4); img.scaleToFit(400, 700); document.add(getWatermarkedImage(cb, img, "Bruno and Ingeborg")); 

Как вы можете видеть, у нас есть очень большое изображение (картина моей жены и меня). Нам нужно масштабировать это изображение так, чтобы оно соответствовало странице. Если вы хотите этого избежать, взгляните на второй подход.

Подход 2:

Второй подход объясняется в примере WatermarkedImages2 . В этом случае мы добавляем каждое изображение в PdfPCell . Этот PdfPCell масштабирует изображение так, чтобы оно соответствовало ширине страницы. Чтобы добавить водяной знак, мы используем событие ячейки:

 class WatermarkedCell implements PdfPCellEvent { String watermark; public WatermarkedCell(String watermark) { this.watermark = watermark; } public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS]; ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER, new Phrase(watermark, FONT), (position.getLeft() + position.getRight()) / 2, (position.getBottom() + position.getTop()) / 2, 30); } } 

Это событие ячейки можно использовать следующим образом:

 PdfPCell cell; cell = new PdfPCell(Image.getInstance(IMAGE1), true); cell.setCellEvent(new WatermarkedCell("Bruno")); table.addCell(cell); cell = new PdfPCell(Image.getInstance(IMAGE2), true); cell.setCellEvent(new WatermarkedCell("Dog")); table.addCell(cell); cell = new PdfPCell(Image.getInstance(IMAGE3), true); cell.setCellEvent(new WatermarkedCell("Fox")); table.addCell(cell); cell = new PdfPCell(Image.getInstance(IMAGE4), true); cell.setCellEvent(new WatermarkedCell("Bruno and Ingeborg")); table.addCell(cell); 

Вы будете использовать этот подход, если все изображения имеют более или менее одинаковый размер, и если вы не хотите беспокоиться об установке изображений на странице.

Рассмотрение:

Очевидно, что оба подхода имеют другой результат из-за выбора дизайна. Пожалуйста, сравните полученные PDF-файлы, чтобы увидеть разницу: watermark_template.pdf и watermark_table.pdf

  • Не удается найти дескриптор библиотеки тегов springframework
  • Перенаправление на внешний URL-адрес из действия controllerа в Spring MVC
  • Разница между примечанием @Controller от источника и @RestController
  • Перечисление карты в JPA с фиксированными значениями?
  • Точка выделения AOP Spring, соответствующая annotations по интерфейсу
  • Отправка сообщения конкретному пользователю в Spring Websocket
  • java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession () Lorg / hibernate / classic / Session
  • как установить заголовок без кэша весной mvc 3 по annotations
  • Как я могу вставить значение свойства в Spring Bean, который был настроен с помощью аннотаций?
  • Список как объект поддержки формы с использованием весны 3 mvc, правильный синтаксис?
  • Как реализовать разбиение на страницы весной MVC 3
  • Interesting Posts

    Мой Mac медленный, но не знаю, что замедляет его

    Как не изменять URL-адрес при отображении страницы ошибки 404 с помощью ui-router

    Как вы создаете разные имена переменных в цикле?

    Как я могу проверить ход матричного умножения?

    Нужно ли использовать autoreleasepool в программе Swift?

    Обнаружен цикл саморегуляции – Возврат данных из WebApi в браузер

    Предварительный просмотр текстовых файлов внутри Zip-файлов в Windows 10 File Explorer

    Разница между / и / * в шаблоне url для отображения сервлета

    Как использовать конструкторы базового classа и оператор присваивания в C ++?

    Получение кода ошибки 0xc004f210 при попытке активации Windows 10 с помощью ключа продукта Windows 8

    как получить MAC-адрес клиента, который просматривает веб-сайт asp.net mvc c #

    Является ли это действительной Java?

    Создание одного большого непрерывного пространства из 4 дисков

    Windows Server 2008 Create Symbolic Link, обновленная политика безопасности по-прежнему дает привилегию

    Как настроить страницу приветствия на действие struts?

    Давайте будем гением компьютера.