Прежде всего: при добавлении текста и изображений на страницу iText иногда меняет порядок текстового содержимого и изображения. Вы можете избежать этого с помощью:
writer.setStrictImageSequence(true);
Если вы хотите знать текущее положение курсора «», вы можете использовать метод getVerticalPosition()
. К сожалению, этот метод не очень изящный: для него требуется булевский параметр, который добавит новую строку (если true
) или даст вам позицию в текущей строке (если false
).
Я не понимаю, почему вы хотите получить вертикальное положение. Это потому, что вы хотите иметь заголовок, сопровождаемый изображением, и хотите, чтобы надпись и изображение находились на одной странице?
В этом случае вы можете поместить текст и изображения в ячейку таблицы и проинструктировать iText не разделять строки. В этом случае iText будет пересылать как текст, так и изображение в правильном порядке на следующую страницу, если содержимое не соответствует текущей странице.
Update:
На основе дополнительной информации, добавленной в комментариях, теперь ясно, что ОП хочет добавить изображения, которые являются водяными.
Существует два подхода к достижению этого, в зависимости от фактического требования.
Подход 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
, когда я пытаюсь добавить текст водяного знака к своему изображению, изображение занимает первую страницу, а текст переходит на вторую страницу. Это происходит только в том случае, если содержимое занимает больше места. нет проблемы. Как решить эту проблему? Я использую метод вертикальной привязки для размещения текста водяного знака для изображения – Madhesh
Что такое текст водяного знака в контексте изображения? Вы уверены, что используете правильное слово? Мне пришлось переписать весь свой вопрос, чтобы понять его. Теперь вы вводите понятие «текст водяного знака в изображение», тогда как ваш исходный вопрос звучал больше, как будто вы говорили о «надписи для изображения». Просьба уточнить! –
Также: когда вы говорите: «Я использую метод вертикальной позиции для размещения текста водяного знака в изображении», вы сбиваете с толку людей. Для получения вертикальной позиции существует метод getVerticalPosition(). Для добавления текста не существует метода вертикальной позиции. Если вы не уточните (например: используя образец кода), мне придется опустить ваш вопрос. –