XSL-FO fop. Длинный текст течет в соседние ячейки/блок, скрывая материал там

Может ли кто-нибудь предложить мне способ сделать длинные слова (например, серийные номера) обернутыми? Я попробовал какое-то коммерческое программное обеспечение, и такой проблемы нет. Это ошибка fop или, возможно, есть доступное решение?

Я не могу вставить пространство с нулевой длиной после каждого символа каждого слова в документе. Это решение кажется безумным для меня.

Ответ 1

Вы можете указать атрибут wrap-option в fo:block так:

<fo:block wrap-option="wrap"> ... stuff </fo:block>

Здесь спецификация XSL-FO для этого атрибута:

Определение XSL:

Значение: no-wrap | упаковка | наследовать

Начальная: обертка

Применяется к: fo: block, fo: inline, fo: номер страницы, ВОК: страница-номер-цитата

Наследуется: да

Процентное: N/A

Медиа: визуальный

Значения имеют следующие значения:

не-обертка

Никакой перенос строк не будет выполнен.

В случае, когда линии длиннее доступная ширина content-rectangle, переполнение будет обрабатываться в соответствии с свойство "переполнения", указанное на ссылочной области.

wrap

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

Определяет способ переноса строк (прерывание строки) содержания объект форматирования должен быть обработан.

Реализации должны поддерживать "no-wrap", как определено в этом Рекомендация, когда значение "linefeed-treatment" - "сохранение".

Вы также можете определить атрибут wrap-option в fo:table-cell

<fo:table-cell wrap-option="wrap"> ... </fo:table-cell>

а fo:block внутри наследует свойство.

Ответ 2

Ответ Zkoh (wraping) поможет вам, только если текст содержит несколько слов, разделенных пробелами. В случае длинных слов (как указано в вопросе) перенос переносится (как предложил Даниэль).

В FOP может быть довольно много проблем с переносом:

  • FOP использует алгоритмы переносов из TeX и из-за некоторых проблем с лицензированием эти алгоритмы (по крайней мере для некоторых языков) не являются частью стандартного двоичного распределения FOP (как указано здесь) и необходимо загрузить отдельно от веб-сайт OFFO. На веб-сайте есть два типа файлов шаблонов переносов. XML-формат (который должен быть скомпилирован 1-м для использования с FOP) и JAR файл (уже скомпилирован). Обязательно загрузите скомпилированную версию! Установка проста и хорошо документирована - просто отбросьте двоичный файл OFFO в папку FOP lib и это...
  • Не забудьте указать язык вашего документа и, если необходимо, включите перенос на уровне блока (его унаследовали, добавив его в корневой элемент, и все будет в порядке) - см. Часто задаваемые вопросы FOP

Ответ 3

Будет ли перенос решения вашей проблемы? Вы должны иметь возможность включить перенос с атрибутом hyphenate="true". Размещение этого атрибута будет зависеть от того, где вы хотите включить перенос.

Здесь ссылка на соответствие переносов FOP: Страница соответствия Apache FOP

Здесь ссылка на спецификацию XSL: XSL SpeС#hyphenate

Если нет, вам может потребоваться поэкспериментировать с некоторыми хранимыми свойствами (например, keep-together.within-line).

Ответ 4

Используйте keep-together.within-column = "always" вместо keep-together = "always" для сохранения длинных строк в ячейке таблицы.

Ответ 5

Речь идет о серийных номерах, а не о словарных словах. Указание hyphenate="true" полезно только тогда, когда словарь переносов или алгоритм переноса могут успешно переносить слова в тексте. Серийные номера редко генерируют последовательности, которые могут быть полезны через дефис, как если бы они были словами.

Конечно, вы можете использовать XSLT для добавления пробелов нулевой ширины в текст в ячейках таблицы, а не делать это вручную. Кару нравятся повторяющиеся вопросы (см. https://stackoverflow.blog/2010/11/16/dr-strangedupe-or-how-i-learned-to-stop-worrying-and-love-duplication/), но, тем не менее, смотрите ответы в XSL-FO: принудительное наложение на записи в таблицах.

Ответ 6

Для решения проблемы переполнения текста используйте атрибут keep-together="auto".enter image description here

Проблема с переполнением текста

enter image description here

Исправлена версия после использования атрибута keep-together="auto".