如何使用PDFBox drawString插入换行符

Fra*_*sco 7 java pdf pdf-generation pdfbox

我必须用表制作PDF.到目前为止它工作正常,但现在我想添加一个包装功能.所以我需要插入换行符.

contentStream.beginText();  
contentStream.moveTextPositionByAmount(x, y);  
contentStream.drawString("Some text to insert into a table.");  
contentStream.endText();  
Run Code Online (Sandbox Code Playgroud)

我想\n在"插入"之前添加一个" ".我尝试了" \u000A"这是换行的十六进制值,但Eclipse向我显示错误.

是否可以使用drawString添加换行符?

Luk*_*kas 13

PDF格式允许换行,但PDFBox没有用于换行的内置功能.

要在PDF中使用换行符,您必须定义要与TL-operator 一起使用的前导.本T*-运算符使一个换行符.本'-运算符写入给定文本到下一行.(有关详细信息,请参阅PDF规范,"文本"一章.不是那么多.)

这是两个代码片段.两者都是相同的,但第一个片段使用',第二个片段使用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

用于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();
}
Run Code Online (Sandbox Code Playgroud)

要获得字体的高度,可以使用以下命令:

fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
Run Code Online (Sandbox Code Playgroud)

您可能希望将其乘以某些线间距因子.

  • 是否有理由仍然使用现已弃用的 [`drawString`](https://pdfbox.apache.org/docs/2.0.5/javadocs/org/apache/pdfbox/pdmodel/PDPageContentStream.html#drawString(java .lang.String)) + `appendRawCommands` 而不是 `showText` 和 [`newLine`](https://pdfbox.apache.org/docs/2.0.5/javadocs/org/apache/pdfbox/pdmodel/PDPageContentStream。 html#newLine()) 如 https://www.tutorialspoint.com/pdfbox/pdfbox_adding_multiple_lines.htm 中所述? (2认同)

Eri*_*rik 8

pdf格式不知道换行符.您必须使用moveTextPositionByAmount拆分字符串并将文本位置移动到下一行.

这不是一个特殊的"pdfbox-feature",它是由pdf格式定义引起的; 所以没有办法使用drawString,也没有其他方法可以调用支持换行.