3 Stimmen

Wie man in Rails eine mehrseitige PDF erstellt, die eine Tabelle mit Daten darstellt (einschließlich Spaltenüberschriften auf jeder neuen Seite)?

Wie erstelle ich in Rails ein mehrseitiges PDF, das eine Tabelle mit Daten darstellt (einschließlich Spaltenüberschriften auf jeder neuen Seite)? Ich habe mir viele Beispiele mit wicked-pdf, pdfkit und prawn angesehen, aber nichts gesehen, das ausdrücklich das Überlaufen auf nachfolgende Seiten und die Notwendigkeit, die Überschriften auf jeder neuen Seite zu wiederholen, behandelt. Vielen Dank für die Hilfe.

4voto

railsdog Punkte 1503

Ich benutze Prawn, um meine PDFs zu generieren, und kann den gewünschten Effekt so erzielen:

def render_photo_table(pdf)
  ps = self.photos.map do |photo|
    [photo.filename, photo.image_height, photo.image_width]
  end
  ps.insert(0, ['Dateiname', 'Höhe', 'Breite'])
  pdf.table(ps) do |table|
    table.header = true
  end
end

Dies erzeugt einen Header (festgelegt in Array-Position 0) oben auf jeder Seite.

3voto

riley Punkte 2268

Auch ich hatte Schwierigkeiten damit, aber ich habe nach vielen Kopfschmerzen einen ziemlich einfachen Weg gefunden, um dies zu tun.

Platzieren Sie ein floated placemark-Div über den Elementen, damit Sie Startkoordinaten erhalten können (ich nenne es ID item_top).

Rendern Sie dann die Seite mit Top-Level-Divs von Daten mit der Klasse 'unbreakable'.

Fügen Sie außerdem eine Klasse hinzu, um einen Seitenwechsel zu erzwingen:

.page-breaker {
  display: block;
  clear: both;
  page-break-after: always;
}

Dann nach dem Rendern

// Ganz oben bei den Elementen
var current_top = $('#item_top').offset().top;
// Überprüfen Sie den Abstand vom oberen Rand der Seite bis zum unteren Rand des Elements
// Wenn größer als die Seitenhöhe, fügen Sie einen Seitenwechsel und Überschriften vor dem Element ein
// Setzen Sie den oberen Rand der Seite auf den oberen Rand des Elements.
$('.unbreakable_section').each(function(index) {
  var item_bottom = $(this).offset().top + $(this).outerHeight(true);
  if ((item_bottom - current_top) > 1250) {
    $(this).before("<div class='page-breaker'></div>");
    $(this).before("Überschriften-Div hier");
    current_top = $(this).offset().top - 48; // element - Headerhöhe
  }
});

Dies misst den vertikalen Abstand seit dem letzten Seitenwechsel und startet eine neue Seite und platziert eine Überschrift darüber, wenn der Abstand die Seitengröße überschreitet. (1250 ist ungefähr, was für mich ausreichend war - ich habe auch einen Footer auf der Seite, daher kann die Höhe je nach Ihrer Konfiguration variieren).

Getestet auf einem 100-seitigen Dokument funktioniert wie erwartet.

1voto

nurettin Punkte 10395

Wir haben unseren hausinternen jQuery-Code dafür geschrieben.

Wenn Sie Seiten wie haben:

Und außerhalb haben Sie:

  omg

  lol

Angenommen, Sie haben eine feste Seitenhöhe (vorzugsweise im A4-Format), können Sie jquery verwenden, um:

  • Berechnen Sie den verbleibenden Platz in mypage, indem Sie die $(element).height() der Kinder der Seite von der Höhe von mypage abziehen
  • Solange noch Platz vorhanden ist, nehmen Sie eine mybox von außerhalb der Seite und platzieren Sie sie innerhalb der Seite
  • Wenn kein Platz mehr vorhanden ist, erstellen Sie eine Kopie der ersten Seite und wiederholen Sie den Vorgang.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X