В reportlab добавьте столько пустых строк в длинную таблицу, сколько поместится на последней странице - PullRequest
2 голосов
/ 09 июня 2011

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

Поэтому я предоставлю несколько (например, 3) пустых строк в виде сетки для заполнения данных. Но если на странице еще осталось место, я бы хотел заполнить ее пустыми строками.

Как я могу добавить столько строк, сколько поместится на последней странице?

Другой подход:
Возможно, такое поведение легче реализовать, если использовать абзац с таблицей из одной строки для каждой строки. Но мне нужно, чтобы первая строка повторялась на каждой странице (что легко в таблицах с repeatRows=1).

Есть идеи?

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Мне нужно пойти, чтобы получить часть своего кода, но я, кажется, вспоминаю, что нужно было что-то делать, измеряя текущую X / Y-позицию, вычисляя это с учетом того запаса, который я использовал, и затем определяя, есть ли больше информацииможет подойти или если мне нужна новая страница.Мой проект заключался в переносе длинных блоков текста, что похоже, но не совсем аналогично.Я обновлю здесь немного кода в ближайшее время.

def newline(self, options, text = ''):
  if getattr(self, 'lpp', None) == self.lines[self.pages]:
    self.newpage()

  if getattr(self, 'y', None) > self.h - self.bm * inch:
    self.newpage()

В этом случае у меня были атрибуты для lpp (Lines Per Page), которые могли быть установлены, поэтому я сначала проверил, существует ли это значение, иесли так, если бы я был на счетчике строк для текущей страницы.Если не было ограничений на общее количество строк на странице, я проверял, какой будет моя позиция Y и каков будет нижний край.При необходимости патч на странице.Здесь кое-что осталось, но это общая идея.

def newline(self, options, text = ''):
  if getattr(self, 'lpp', None) == self.lines[self.pages]:
    self.newpage()

  if getattr(self, 'y', None) > self.h - self.bm * inch:
    self.newpage()

  self.addLine()

  self.putText(self.x, self.h - self.y, text)

def putText(self, x, y, text):
  # If we actually place some text then we want to record that.
  if len(text.strip()) > 0 and not self.hasText[self.pages]:
    self.hasText[self.pages] = True
  # Something here to handle word wrap.
  if self.wrap:
    lines = self._breakScan(text)

    if len(lines) > 1:
      self.c.drawString(x, y, lines[0])

      self.newline('', ' '.join(lines[1:]))
    elif lines:
      self.c.drawString(x, y, lines[0])
  else:
    self.c.drawString(x, y, text)

Здесь, self.c - это мое полотно.Я отслеживаю, сколько строк я разместил на странице, потому что бывают случаи, когда мы перезаписываем документ, который может содержать разрывы страниц, все в нашей пользовательской разметке.

0 голосов
/ 10 июня 2011

В зависимости от того, где эта таблица заканчивается в документе, быстрое, хакерское решение может заключаться в том, чтобы просто вставить достаточно строк в таблицу, чтобы убедиться, что она заполняет страницу и перетекает на следующую страницу. Затем, после создания документа, отрежьте последнюю страницу и создайте новый PDF, просто пропустив эту страницу.

Конечно, это работает, только если таблица находится в конце документа (или, если вы используете коммерческую версию ReportLab, вы можете сшивать PDF-файлы, в этом случае это не имеет значения), и это как-то уродливо, как я уже сказал, но это делает работу ..

...