По this answer это не представляется возможным, чтобы вставить разрыв строки в какой-нибудь текст и есть PDF отобразить его правильно (будь то с помощью PDFBox или что-то еще), поэтому считаю, что я автоматически обертывание текст, чтобы поместиться в некоторой ширины также может быть то, что он не может сделать автоматически. (кроме того, есть много способов обернуть текст - только целые слова, разбить их на более мелкие части и т. д.)
This answer в другой вопрос (о центрировании строки) дает некоторые указания относительно того, как это сделать самому. Предполагая, что вы написали функцию 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
, что позволяют оборачивать в любой точке, которая не является частью слова (reference), может быть:
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;
}
Update: некоторые дополнительная информация:
Формат PDF-файла был разработан так, чтобы выглядеть одинаково в разных ситуациях, функциональность, подобная той, которую вы запросили, имеет смысл в редакторе/создателе PDF, но не в файле PDF per se. По этой причине большинство инструментов «низкого уровня» имеют тенденцию концентрироваться на том, чтобы иметь дело с самим файловым форматом и оставлять подобные вещи.
Инструменты высшего уровня OTOH обычно имеют средства для этого преобразования. Примером является Platypus (для Python, хотя), что 10 do имеют простые способы создания абзацев и полагаются на нижний уровень ReportLab функции для реального рендеринга PDF. Я не знаю подобных инструментов для PDFBox, но this post дает некоторые подсказки о том, как конвертировать HTML-контент в PDF в среду Java, используя свободно доступные инструменты. Я не пробовал их самостоятельно, но я размещаю здесь, так как это может быть полезно (в случае, если моей ручной попытки выше недостаточно).
В PDF можно сделать разрыв строки. (см. [мой ответ] (http://stackoverflow.com/a/15205956/1016477)) – Lukas