9

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

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

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

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

4

3 回答 3

15

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

要在 PDF 中使用换行符,您必须定义要与 -TL运算符一起使用的前导。-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);
  }
}

用于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;

您可能希望将它乘以一些线间距因子。

于 2013-03-04T16:13:55.287 回答
8

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

这不是一个特殊的“pdfbox-feature”,这是由于pdf格式的定义;所以drawString没有办法,也没有其他方法可以调用支持换行符。

于 2011-09-29T13:37:46.757 回答
0

因为 PDF 模型通常不是手头任务的最佳模型,所以为它编写一个包装器以增加对您案例中“缺失”的任何内容的支持通常是有意义的。这对于阅读和写作都是如此。

于 2011-09-29T14:24:40.787 回答