Предупреждение: этот ответ относится к старой версии PDFBox и основан на функциях, которые с тех пор устарели. См. комментарии ниже для более подробной информации.
В соответствии с этот ответ невозможно вставить разрывы строк в некоторый текст и правильно отобразить PDF (будь то с помощью PDFBox или чего-то еще else), поэтому я считаю, что автообтекание некоторого текста, чтобы он соответствовал некоторой ширине, также может быть чем-то, что он не может сделать автоматически. (кроме того, есть много способов обернуть текст - только целые слова, разбить их на более мелкие части и т. д.)
Этот ответ на другой вопрос (о центрировании строки) дает некоторые советы о том, как сделать это самостоятельно. Предполагая, что вы написали функцию 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), который < strong>do имеют простые способы создания абзацев и полагаются на функции нижнего уровня ReportLab для сделать фактический рендеринг PDF. Я не знаю подобных инструментов для PDFBox, но этот пост дает некоторые советы о том, как для преобразования содержимого HTML в PDF в среде Java с использованием свободно доступных инструментов. Сам не пробовал, но пишу сюда, так как это может быть полезно (на случай, если моей попытки, сделанной вручную выше, недостаточно).
person
mgibsonbr
schedule
01.01.2013