为整个 Prawn PDF 文档动态设置高度
Set dynamically height for entire Prawn PDF Document
我在尝试使用 Prawn gem 为 Rails
生成文档时遇到了问题
我想做的是为我的 pdf 设置可变高度,因此根据数据库中的某些查询,PDF 高度会发生变化。我这样做是因为我需要一个单页 PDF 文档。
目前,我的代码如下所示:
pdf = Prawn::Document.new(page_size: [297.64, 419.53], margin: 0)
....
data = [ ["Header1", "Header2", "Header3", "Header4", "Header5", "Header6"] ]
// here is the variable data
cart.cart_products.each do |cp|
arr = [
cp.product_code,
cp.product_description,
cp.amount,
cp.product_metric,
cp.product_unit_value,
cp.total_value
]
data.push(arr)
end
// populating the table with data
pdf.table(data, :cell_style => {:border_width => 0}, :column_widths => [45, 80, 30, 42.36, 50, 50]) do |table|
table.row(0).border_width = 0.1.mm
table.row(0).font_style = :bold
table.row(0).borders = [:bottom]
end
....
pdf.render_file("path/to/dir/document.pdf")
谁能帮我解决这个问题?谢谢
不知道你到底在调整什么,我不得不在这里做一些猜测。
所以我会为您返回的数据建立某种行高和最小文档高度。
line_height = 14
min_height = 419.53
然后我会运行查询并计算结果。然后我会弄清楚可变高度是多少并将其添加到最小高度。
variable_height = results.length * line_height
height = min_height + variable_height
最后:
pdf = Prawn::Document.new(page_size: [297.64, height], margin: 0)
像这样的东西应该可以根据您的特定需求进行调整。
Thomas Leitner 在 GitHub 问题评论 (https://github.com/prawnpdf/prawn/issues/974#issuecomment-239751947) 中提出了一个更好的选择:
Just what I wanted to post - so here it goes:
You could probably use a a very large height for your document so that prawn doesn't automatically create a new one. And once you are finished with everything, use Prawn::Document#y to determine your current vertical position.
Then you can use Prawn::Document#page (a PDF::Core::Page object) to adjust the MediaBox for the page, something like:
require 'prawn'
Prawn::Document.generate("test.pdf", page_size: [100, 2000], margin: 10) do |doc|
rand(100).times do
doc.text("some text")
end
doc.page.dictionary.data[:MediaBox] = [0, doc.y - 10, 100, 2000]
end
感谢 Thomas Leitner (https://github.com/gettalong)
我在尝试使用 Prawn gem 为 Rails
生成文档时遇到了问题我想做的是为我的 pdf 设置可变高度,因此根据数据库中的某些查询,PDF 高度会发生变化。我这样做是因为我需要一个单页 PDF 文档。
目前,我的代码如下所示:
pdf = Prawn::Document.new(page_size: [297.64, 419.53], margin: 0)
....
data = [ ["Header1", "Header2", "Header3", "Header4", "Header5", "Header6"] ]
// here is the variable data
cart.cart_products.each do |cp|
arr = [
cp.product_code,
cp.product_description,
cp.amount,
cp.product_metric,
cp.product_unit_value,
cp.total_value
]
data.push(arr)
end
// populating the table with data
pdf.table(data, :cell_style => {:border_width => 0}, :column_widths => [45, 80, 30, 42.36, 50, 50]) do |table|
table.row(0).border_width = 0.1.mm
table.row(0).font_style = :bold
table.row(0).borders = [:bottom]
end
....
pdf.render_file("path/to/dir/document.pdf")
谁能帮我解决这个问题?谢谢
不知道你到底在调整什么,我不得不在这里做一些猜测。
所以我会为您返回的数据建立某种行高和最小文档高度。
line_height = 14
min_height = 419.53
然后我会运行查询并计算结果。然后我会弄清楚可变高度是多少并将其添加到最小高度。
variable_height = results.length * line_height
height = min_height + variable_height
最后:
pdf = Prawn::Document.new(page_size: [297.64, height], margin: 0)
像这样的东西应该可以根据您的特定需求进行调整。
Thomas Leitner 在 GitHub 问题评论 (https://github.com/prawnpdf/prawn/issues/974#issuecomment-239751947) 中提出了一个更好的选择:
Just what I wanted to post - so here it goes:
You could probably use a a very large height for your document so that prawn doesn't automatically create a new one. And once you are finished with everything, use Prawn::Document#y to determine your current vertical position.
Then you can use Prawn::Document#page (a PDF::Core::Page object) to adjust the MediaBox for the page, something like:
require 'prawn'
Prawn::Document.generate("test.pdf", page_size: [100, 2000], margin: 10) do |doc|
rand(100).times do
doc.text("some text")
end
doc.page.dictionary.data[:MediaBox] = [0, doc.y - 10, 100, 2000]
end
感谢 Thomas Leitner (https://github.com/gettalong)