Ответ 1
Предупреждение: этот ответ относится к старой версии PDFBox и использует функции, которые с тех пор устарели. Смотрите комментарии ниже для более подробной информации.
Согласно этому ответу невозможно вставить разрывы строк в какой-либо текст и правильно отобразить его в PDF-формате (будь то использование PDFBox или чего-то еще), поэтому я считаю, что автоматическая обертка некоторого текста может вписаться в некоторую ширину. быть чем-то, что он не может сделать автоматически. (кроме того, есть много способов обернуть текст - только целые слова, разбить их на более мелкие части и т.д.)
Этот ответ на другой вопрос (о центрировании строки) дает некоторые советы о том, как сделать это самостоятельно. Предполагая, что вы написали функцию possibleWrapPoints(String):int[]
для перечисления всех точек в тексте, где может произойти перенос слов (исключая "ноль", включая "длину текста"), одним из возможных решений может быть:
PDFont font = PDType1Font.HELVETICA_BOLD; // Or whatever font you want.
int fontSize = 16; // Or whatever font size you want.
int paragraphWidth = 200;
String text = "test text";
int start = 0;
int end = 0;
int height = 10;
for ( int i : possibleWrapPoints(text) ) {
float width = font.getStringWidth(text.substring(start,i)) / 1000 * fontSize;
if ( start < end && width > paragraphWidth ) {
// Draw partial text and increase height
content.moveTextPositionByAmount(10 , height);
content.drawString(text.substring(start,end));
height += font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
start = end;
}
end = i;
}
// Last piece of text
content.moveTextPositionByAmount(10 , height);
content.drawString(text.substring(start));
Одним из примеров possibleWrapPoints
, который допускает перенос в любую точку, которая не является частью слова (ссылка), может быть:
int[] possibleWrapPoints(String text) {
String[] split = text.split("(?<=\\W)");
int[] ret = new int[split.length];
ret[0] = split[0].length();
for ( int i = 1 ; i < split.length ; i++ )
ret[i] = ret[i-1] + split[i].length();
return ret;
}
Обновление: дополнительная информация:
Формат файла PDF был разработан так, чтобы он выглядел одинаково в разных ситуациях. Функциональность, подобная той, которую вы запрашивали, имеет смысл в редакторе/создателе PDF, но не в самом файле PDF. По этой причине большинство "низкоуровневых" инструментов, как правило, концентрируются на работе с самим форматом файла и оставляют подобные вещи.
Инструменты более высокого уровня OTOH обычно имеют средства для этого преобразования. Примером является Platypus (хотя для Python), который делает имеет простые способы создания абзацев и использует функции ReportLab более низкого уровня для выполнения реальных PDF рендеринг. Мне неизвестны подобные инструменты для PDFBox, но этот пост дает некоторые советы о том, как преобразовать HTML-контент в PDF в среде Java, используя свободно доступные инструменты. Я не пробовал их сам, но я публикую здесь, поскольку это может быть полезно (в случае, если моей вышеописанной ручной попытки недостаточно).