Как вставить перевод строки с помощью PDFBox drawString - PullRequest
7 голосов
/ 29 сентября 2011

Я должен сделать PDF с таблицей. Пока все работает нормально, но теперь я хочу добавить функцию обтекания. Поэтому мне нужно вставить перевод строки.

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

Я хочу добавить «\n» перед «вставить». Я попытался "\u000A", который является шестнадцатеричным значением для перевода строки, но Eclipse показывает мне ошибку.

Можно ли добавить перевод строки с помощью drawString?

Ответы [ 3 ]

13 голосов
/ 04 марта 2013

Формат 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;

Возможно, вы захотите умножить его с некоторым шагом строки.

8 голосов
/ 29 сентября 2011

Формат PDF не знает разрывов строк.Вы должны разбить строку и переместить текстовую позицию на следующую строку, используя moveTextPositionByAmount.

Это не специальная «функция pdfbox», это связано с определением формата pdf;поэтому для drawString нет способа, а также нет других вызываемых методов, поддерживающих перевод строки.

0 голосов
/ 29 сентября 2011

Поскольку модель PDF часто не является лучшей моделью для выполняемой задачи, часто имеет смысл написать для нее оболочку, которая добавляет поддержку для всего, что «отсутствует» в вашем случае. Это верно как для чтения, так и для письма.

...