PDF形式では改行が可能ですが、PDFBoxでは改行機能が組み込まれていません。
PDFで改行を使用するには、TL
オペレータで使用する先頭を定義する必要があります。 - オペレータが改行します。 '
-operatorは、指定されたテキストを次の行に書き込みます。 (詳細については、PDF-specの章「Text」の章を参照してください)。
2つのコードスニペットがあります。どちらも同じですが、最初のスニペットは'
を使用し、2番目のスニペットはT*
を使用します。改行のための
private void printMultipleLines(
PDPageContentStream contentStream,
List<String> lines,
float x,
float y) throws IOException {
if (lines.size() == 0) {
return;
}
final int numberOfLines = lines.size();
final float fontHeight = getFontHeight();
contentStream.beginText();
contentStream.appendRawCommands(fontHeight + " TL\n");
contentStream.moveTextPositionByAmount(x, y);
contentStream.drawString(lines.get(0));
for (int i = 1; i < numberOfLines; i++) {
contentStream.appendRawCommands(escapeString(lines.get(i)));
contentStream.appendRawCommands(" \'\n");
}
contentStream.endText();
}
private String escapeString(String text) throws IOException {
try {
COSString string = new COSString(text);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
string.writePDF(buffer);
return new String(buffer.toByteArray(), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
// every JVM must know ISO-8859-1
throw new RuntimeException(e);
}
}
使用T*
:
private void printMultipleLines(
PDPageContentStream contentStream,
List<String> lines,
float x,
float y) throws IOException {
if (lines.size() == 0) {
return;
}
final int numberOfLines = lines.size();
final float fontHeight = getFontHeight();
contentStream.beginText();
contentStream.appendRawCommands(fontHeight + " TL\n");
contentStream.moveTextPositionByAmount(x, y);
for (int i = 0; i < numberOfLines; i++) {
contentStream.drawString(lines.get(i));
if (i < numberOfLines - 1) {
contentStream.appendRawCommands("T*\n");
}
}
contentStream.endText();
}
このコマンドを使用することができ、フォントの高さを取得するには:あなたはそれを乗算する場合があります
fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000 * fontSize;
をいくつかのラインピッチを聖霊降臨祭因子。
@Erik:しかし、 'T *'と '' --operatorは何ですか? pdf-specはT *に言う:「次の行の先頭に移動する」そして、 ': "次の行に移動し、テキスト文字列を表示します"。しかし、私はpdfBoxでT *や 'を使う方法を見つけることができませんでした。 (そして私は仕様を正しく理解しているかどうかわからない。) – Lukas