2014-11-08 3 views
3

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

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

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

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

ответ

3

Прежде всего: при добавлении текста и изображений на страницу 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

+0

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

+0

Что такое текст водяного знака в контексте изображения? Вы уверены, что используете правильное слово? Мне пришлось переписать весь свой вопрос, чтобы понять его. Теперь вы вводите понятие «текст водяного знака в изображение», тогда как ваш исходный вопрос звучал больше, как будто вы говорили о «надписи для изображения». Просьба уточнить! –

+0

Также: когда вы говорите: «Я использую метод вертикальной позиции для размещения текста водяного знака в изображении», вы сбиваете с толку людей. Для получения вертикальной позиции существует метод getVerticalPosition(). Для добавления текста не существует метода вертикальной позиции. Если вы не уточните (например: используя образец кода), мне придется опустить ваш вопрос. –

Смежные вопросы