В reportlab добавьте столько пустых строк в длинную таблицу, сколько поместится на последней странице

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

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

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

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

Есть идеи?


person jammon    schedule 09.06.2011    source источник


Ответы (2)


Мне придется найти часть моего кода, но я, кажется, припоминаю, что мне приходилось делать что-то, измеряя текущую позицию 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 (количество строк на странице), которые могли быть установлены, поэтому я сначала проверил, существует ли это значение, и если да, то был ли я на подсчете строк для текущей страницы. Если бы не было ограничений на общее количество строк на странице, я проверил бы, какой будет моя позиция 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 мой холст. Я слежу за тем, сколько строк я разместил на странице, потому что бывают случаи, когда мы перепаковываем документ, который может содержать разрывы страниц, и все это в нашей пользовательской разметке.

person g.d.d.c    schedule 09.06.2011
comment
Думаю, я понял идею. Является ли новая строка методом абзаца? Когда это называется? - person jammon; 10.06.2011
comment
@jammon - Извините, я мог бы объяснить свой подход немного подробнее. Self в данном случае является пользовательским классом. Он сопоставляет различные команды из пользовательского синтаксиса разметки с соответствующими вызовами API в reportlab. Вероятно, в их библиотеке нет метода newline(). Я добавлю дополнительный код для дальнейшей демонстрации. - person g.d.d.c; 10.06.2011
comment
Спасибо большое. Я постараюсь обернуть свой мозг вокруг этого. Reportlab отлично подходит для начинающих, но наверняка есть грани и задачи, решение которых далеко не очевидно. - person jammon; 11.06.2011
comment
@jammon - Нет проблем. Рад помочь. Я обнаружил, что есть несколько вещей, которые, вероятно, были бы намного более прямыми, если бы они использовали их платную библиотеку, но используя библиотеки с открытым исходным кодом, вы в конечном итоге кодируете некоторые из их встроенных ограничений. Эти строки на странице определенно являются одним из них. - person g.d.d.c; 12.06.2011

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

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

person G Gordon Worley III    schedule 10.06.2011