Могу ли я сказать iText, как обрезать текст, чтобы он поместился в ячейке

Когда я вызываю setFixedHeight() для PdfPCell и добавляю больше текста, чем помещается в заданную высоту, iText, кажется, печатает префикс строки, которая подходит.

Могу ли я управлять этим алгоритмом отсечения? Например:

  1. Печатайте суффикс строки, а не префикс.

  2. Пометить подстроку строки как не подлежащую удалению. Это со ссылками на сноски. Если я добавляю текст «Hello World [1]», [1] является ссылкой на сноску и не должен удаляться. Другие символы строки, например «Мир», можно удалить.

  3. Когда в строке несколько слов, iText, кажется, исключает слово, которое не подходит, в то время как я хотел бы, чтобы оно было напечатано частично. То есть, если строка «Hello World», а в ячейке есть место только для «Hello Wo...», я бы хотел, чтобы это было напечатано, а не просто «Hello», как печатает iText.

  4. Вместо того, чтобы печатать символы целиком, печатайте только их часть. Представьте, что вы печатаете текст в PNG и обрезаете верхнюю и/или нижнюю часть PNG, чтобы он поместился в доступном пространстве. Например, обратите внимание, что верхняя и нижняя строки здесь частично обрезаны:

введите здесь описание изображения

Возможны ли какие-либо из них? Предоставляет ли iText какой-либо контроль над обрезанием текста? Спасибо.

Это со ссылкой на iText 2.1.6.


person Kartick Vaddadi    schedule 28.02.2014    source источник
comment
Это можно сделать с помощью событий ячейки. Другими словами: создайте пустую ячейку с фиксированной высотой и добавьте содержимое в метод layout() события ячейки. Если вам интересно, почему я не хочу давать вам пример кода: меня зовут Лоуэги (тот, на который вы ссылаетесь в своем коде), и я хочу, чтобы люди перестали использовать устаревшие версии iText. См. itextpdf.com/salesfaq.   -  person Bruno Lowagie    schedule 28.02.2014
comment
Спасибо, Бруно. Я знаю, кто вы :) Я попробую трюк layout().   -  person Kartick Vaddadi    schedule 28.02.2014


Ответы (2)


Я написал доказательство концепции, ClipCenterCellContent, где мы пытаемся разместить текст "D2 is a cell with more content than we can fit into the cell." в слишком маленькая ячейка.

Как и в вашем другом вопросе ( iText -- Как я получаю визуализированные размеры текста?), мы добавляем содержимое, используя событие ячейки, но теперь мы добавляем его дважды: один раз в режиме симуляции (чтобы узнать, сколько места необходимо по вертикали) и один раз в реальном (с использованием смещения).

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

PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
ColumnText ct = new ColumnText(canvas);
ct.setSimpleColumn(new Rectangle(0, 0, position.getWidth(), -1000));
ct.addElement(content);
ct.go(true);
float spaceneeded = 0 - ct.getYLine();
System.out.println(String.format("The content requires %s pt whereas the height is %s pt.", spaceneeded, position.getHeight()));

Теперь мы знаем необходимую высоту и можем добавить контент по-настоящему, используя смещение:

float offset = (position.getHeight() - spaceneeded) / 2;
System.out.println(String.format("The difference is %s pt; we'll need an offset of %s pt.", -2f * offset, offset));
PdfTemplate tmp = canvas.createTemplate(position.getWidth(), position.getHeight());
ct = new ColumnText(tmp);
ct.setSimpleColumn(0, offset, position.getWidth(), offset + spaceneeded);
ct.addElement(content);
ct.go();
canvas.addTemplate(tmp, position.getLeft(), position.getBottom());

В этом случае я использовал PdfTemplate для вырезания содержимого.

У меня также есть ответы на другие ваши вопросы, но у меня нет времени отвечать на них прямо сейчас.

person Bruno Lowagie    schedule 01.03.2014

Для прямого вырезания текстового поля я адаптировал приведенный здесь код С#.

http://itextsharp.10939.n7.nabble.com/Limiting-Text-Width-using-PdfContentByte-td2481.html

к приведенному ниже коду Java. Область отсечения заканчивается за пределами этого прямоугольника, поэтому вы все равно можете нарисовать прямоугольник с теми же точными координатами.

cb.saveState(); 
cb.rectangle(left,top,width,height); 
cb.clip(); 
cb.newPath(); 
// perform clipped output here 
cb.restoreState(); 

Я использовал попытку/наконец, чтобы гарантировать, что restoreState() был вызван.

person englebart    schedule 12.01.2016
comment
Спасибо - это лучшее решение. - person David Thielen; 21.09.2016