警告:この回答は古いバージョンのPDFBoxに適用され、その後廃止された機能に依存しています。詳細については、以下のコメントを参照してください。
この回答によると、一部のテキストに改行を挿入してPDFで正しく表示することはできません(PDFBoxなどを使用しているかどうかに関係なく)。したがって、一部のテキストを自動折り返しして幅に合わせることができない場合もあると思います。自動的に行います。(さらに、テキストを折り返す方法はたくさんあります-単語全体のみ、小さな部分に分割するなど)
別の質問(文字列の中央揃えについて)に対するこの回答は、これを自分で行う方法に関するいくつかの指針を示しています。ワードラップが発生する可能性のあるテキスト内のすべてのポイントを一覧表示する関数possibleWrapPoints(String):int[]
を作成したとすると(「テキストの長さ」を含む「ゼロ」を除く)、考えられる解決策の1つは次のとおりです。
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
の一部ではない任意のポイントで折り返しを許可するの1つの例は、次のようになります。
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の場合)があります。これは、段落を簡単に作成する方法があり、実際のPDFレンダリングを行うために低レベルのReportLab関数に依存しています。私はPDFBoxの同様のツールを知りませんが、この投稿では、無料で利用できるツールを使用して、Java環境でHTMLコンテンツをPDFに変換する方法についていくつかのヒントを提供します。自分で試したことはありませんが、役に立つかもしれないのでここに投稿します(上記の手作りの試みでは不十分な場合に備えて)。