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.
Antworten
Zu viele Anzeigen?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.
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.
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.