1つのデータテーブル(新しい各ページの列ヘッダーを含む)を表す複数ページのPDFをRailsで作成するにはどうすればよいですか?wicked-pdf、pdfkit、およびエビを使用した多くの例を見てきましたが、後続のページへのオーバーフローと、新しいページごとにヘッダーを繰り返す必要性に具体的に対処するものは見当たりませんでした。助けてくれてありがとう。
3 に答える
私はPrawnを使用してPDFを生成し、次のように希望する効果を得ることができます。
def render_photo_table(pdf)
ps = self.photos.map do |photo|
[photo.filename, photo.image_height, photo.image_width]
end
ps.insert(0, ['Filename', 'Height', 'Width'])
pdf.table(ps) do |table|
table.header = true
end
end
これにより、各ページの上部にヘッダー(配列位置0に設定)が生成されます。
これにも問題がありましたが、これを行うためのかなり簡単な方法を(多くの頭痛の種の後)見つけました。
アイテムの上にフローティングの目印 div を配置して、開始座標を取得できるようにします (ID item_top と呼びます)。
次に、クラス ' ' を使用して、データの最上位 div を含むページをレンダリングしますunbreakable
。
改ページを強制するクラスも含めます。
.page-breaker {
display: block;
clear: both;
page-break-after: always;
}
次にレンダリング後
<script>
// Very top of items
var current_top = $('#item_top').offset().top;
// Check distance from top of page to bottom of item
// If greater than page size put page break and headers before
// Reset top of page to top of item.
$('.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("Headings Div here");
current_top = $(this).offset().top - 48; // item - header height
}
});
</script>
これにより、最後の改ページ以降の垂直方向のスペースが測定され、スペースがページの高さを超えている場合は、新しいページが開始され、その上にヘッダーが配置されます。(1250 は概算で、私にとっては十分に近い値です。ページにもフッターがあるため、設定によって高さが異なる場合があります)。
100 ページのドキュメントでテストすると、期待どおりに動作します。
このために社内のjqueryコードを作成しました。
次のようなページがある場合:
<div class="mypage">
<div class="mypage_footer"></div>
</div>
そしてあなたの外には:
<div class="mybox">
<table><tbody><tr><td>omg</td></tr></tbody></table>
</div>
<div class="mybox">
<table><tbody><tr><td>lol</td></tr></tbody></table>
</div>
ページの高さが固定されている(できればA4サイズ)と仮定すると、jqueryを使用して次のことができます。
- マイページの高さからページの子の$(element).height()を引くことにより、マイページ内の残りのスペースを計算します
- 残りのスペースがある間に、ページの外側からmyboxを選択し、ページの内側に配置します
- スペースがなくなった場合は、最初のページのコピーを作成して繰り返します。