Skip to content

Commit 4f4ace3

Browse files
author
Olivier Bonnaure
committed
fix: add metrics json files for demo purpose and remove unsused code
1 parent 3d8be4c commit 4f4ace3

File tree

6 files changed

+115
-26
lines changed

6 files changed

+115
-26
lines changed

.lua/pdfgenerator.lua

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ local function numberToString(num)
3232
return string.format("%.2f", num)
3333
end
3434

35-
local fontHelveticaMetrics = {
36-
bold = decodeJson([[{"32":277.83203125,"33":333.0078125,"34":474.12109375,"35":556.15234375,"36":556.15234375,"37":889.16015625,"38":722.16796875,"39":237.79296875,"40":333.0078125,"41":333.0078125,"42":389.16015625,"43":583.984375,"44":277.83203125,"45":333.0078125,"46":277.83203125,"47":277.83203125,"48":556.15234375,"49":556.15234375,"50":556.15234375,"51":556.15234375,"52":556.15234375,"53":556.15234375,"54":556.15234375,"55":556.15234375,"56":556.15234375,"57":556.15234375,"58":333.0078125,"59":333.0078125,"60":583.984375,"61":583.984375,"62":583.984375,"63":610.83984375,"64":975.09765625,"65":722.16796875,"66":722.16796875,"67":722.16796875,"68":722.16796875,"69":666.9921875,"70":610.83984375,"71":777.83203125,"72":722.16796875,"73":277.83203125,"74":556.15234375,"75":722.16796875,"76":610.83984375,"77":833.0078125,"78":722.16796875,"79":777.83203125,"80":666.9921875,"81":777.83203125,"82":722.16796875,"83":666.9921875,"84":610.83984375,"85":722.16796875,"86":666.9921875,"87":943.84765625,"88":666.9921875,"89":666.9921875,"90":610.83984375,"91":333.0078125,"92":277.83203125,"93":333.0078125,"94":583.984375,"95":556.15234375,"96":333.0078125,"97":556.15234375,"98":610.83984375,"99":556.15234375,"100":610.83984375,"101":556.15234375,"102":333.0078125,"103":610.83984375,"104":610.83984375,"105":277.83203125,"106":277.83203125,"107":556.15234375,"108":277.83203125,"109":889.16015625,"110":610.83984375,"111":610.83984375,"112":610.83984375,"113":610.83984375,"114":389.16015625,"115":556.15234375,"116":333.0078125,"117":610.83984375,"118":556.15234375,"119":777.83203125,"120":556.15234375,"121":556.15234375,"122":500,"123":389.16015625,"124":279.78515625,"125":389.16015625,"126":583.984375,"127":722.16796875,"128":722.16796875,"129":722.16796875,"130":722.16796875,"131":722.16796875,"132":722.16796875,"133":722.16796875,"134":722.16796875,"135":722.16796875,"136":722.16796875,"137":722.16796875,"138":722.16796875,"139":722.16796875,"140":722.16796875,"141":722.16796875,"142":722.16796875,"143":722.16796875,"144":722.16796875,"145":722.16796875,"146":722.16796875,"147":722.16796875,"148":722.16796875,"149":722.16796875,"150":722.16796875,"151":722.16796875,"152":722.16796875,"153":722.16796875,"154":722.16796875,"155":722.16796875,"156":722.16796875,"157":722.16796875,"158":722.16796875,"159":722.16796875,"160":277.83203125,"161":333.0078125,"162":556.15234375,"163":556.15234375,"164":556.15234375,"165":556.15234375,"166":279.78515625,"167":556.15234375,"168":333.0078125,"169":736.81640625,"170":370.1171875,"171":556.15234375,"172":583.984375,"173":333.0078125,"174":736.81640625,"175":333.0078125,"176":399.90234375,"177":548.828125,"178":333.0078125,"179":333.0078125,"180":333.0078125,"181":576.171875,"182":556.15234375,"183":277.83203125,"184":333.0078125,"185":333.0078125,"186":365.234375,"187":556.15234375,"188":833.984375,"189":833.984375,"190":833.984375,"191":610.83984375,"192":722.16796875,"193":722.16796875,"194":722.16796875,"195":722.16796875,"196":722.16796875,"197":722.16796875,"198":1000,"199":722.16796875,"200":666.9921875,"201":666.9921875,"202":666.9921875,"203":666.9921875,"204":277.83203125,"205":277.83203125,"206":277.83203125,"207":277.83203125,"208":722.16796875,"209":722.16796875,"210":777.83203125,"211":777.83203125,"212":777.83203125,"213":777.83203125,"214":777.83203125,"215":583.984375,"216":777.83203125,"217":722.16796875,"218":722.16796875,"219":722.16796875,"220":722.16796875,"221":666.9921875,"222":666.9921875,"223":610.83984375,"224":556.15234375,"225":556.15234375,"226":556.15234375,"227":556.15234375,"228":556.15234375,"229":556.15234375,"230":889.16015625,"231":556.15234375,"232":556.15234375,"233":556.15234375,"234":556.15234375,"235":556.15234375,"236":277.83203125,"237":277.83203125,"238":277.83203125,"239":277.83203125,"240":610.83984375,"241":610.83984375,"242":610.83984375,"243":610.83984375,"244":610.83984375,"245":610.83984375,"246":610.83984375,"247":548.828125,"248":610.83984375,"249":610.83984375,"250":610.83984375,"251":610.83984375,"252":610.83984375,"253":556.15234375,"254":610.83984375,"255":556.15234375,"256":722.16796875}]]),
37-
normal = decodeJson([[{"32":277.83203125,"33":277.83203125,"34":354.98046875,"35":556.15234375,"36":556.15234375,"37":889.16015625,"38":666.9921875,"39":190.91796875,"40":333.0078125,"41":333.0078125,"42":389.16015625,"43":583.984375,"44":277.83203125,"45":333.0078125,"46":277.83203125,"47":277.83203125,"48":556.15234375,"49":556.15234375,"50":556.15234375,"51":556.15234375,"52":556.15234375,"53":556.15234375,"54":556.15234375,"55":556.15234375,"56":556.15234375,"57":556.15234375,"58":277.83203125,"59":277.83203125,"60":583.984375,"61":583.984375,"62":583.984375,"63":556.15234375,"64":1015.13671875,"65":666.9921875,"66":666.9921875,"67":722.16796875,"68":722.16796875,"69":666.9921875,"70":610.83984375,"71":777.83203125,"72":722.16796875,"73":277.83203125,"74":500,"75":666.9921875,"76":556.15234375,"77":833.0078125,"78":722.16796875,"79":777.83203125,"80":666.9921875,"81":777.83203125,"82":722.16796875,"83":666.9921875,"84":610.83984375,"85":722.16796875,"86":666.9921875,"87":943.84765625,"88":666.9921875,"89":666.9921875,"90":610.83984375,"91":277.83203125,"92":277.83203125,"93":277.83203125,"94":469.23828125,"95":556.15234375,"96":333.0078125,"97":556.15234375,"98":556.15234375,"99":500,"100":556.15234375,"101":556.15234375,"102":277.83203125,"103":556.15234375,"104":556.15234375,"105":222.16796875,"106":222.16796875,"107":500,"108":222.16796875,"109":833.0078125,"110":556.15234375,"111":556.15234375,"112":556.15234375,"113":556.15234375,"114":333.0078125,"115":500,"116":277.83203125,"117":556.15234375,"118":500,"119":722.16796875,"120":500,"121":500,"122":500,"123":333.984375,"124":259.765625,"125":333.984375,"126":583.984375,"127":633.7890625,"128":633.7890625,"129":633.7890625,"130":633.7890625,"131":633.7890625,"132":633.7890625,"133":633.7890625,"134":633.7890625,"135":633.7890625,"136":633.7890625,"137":633.7890625,"138":633.7890625,"139":633.7890625,"140":633.7890625,"141":633.7890625,"142":633.7890625,"143":633.7890625,"144":633.7890625,"145":633.7890625,"146":633.7890625,"147":633.7890625,"148":633.7890625,"149":633.7890625,"150":633.7890625,"151":633.7890625,"152":633.7890625,"153":633.7890625,"154":633.7890625,"155":633.7890625,"156":633.7890625,"157":633.7890625,"158":633.7890625,"159":633.7890625,"160":277.83203125,"161":333.0078125,"162":556.15234375,"163":556.15234375,"164":556.15234375,"165":556.15234375,"166":259.765625,"167":556.15234375,"168":333.0078125,"169":736.81640625,"170":370.1171875,"171":556.15234375,"172":583.984375,"173":333.0078125,"174":736.81640625,"175":333.0078125,"176":399.90234375,"177":548.828125,"178":333.0078125,"179":333.0078125,"180":333.0078125,"181":576.171875,"182":537.109375,"183":277.83203125,"184":333.0078125,"185":333.0078125,"186":365.234375,"187":556.15234375,"188":833.984375,"189":833.984375,"190":833.984375,"191":610.83984375,"192":666.9921875,"193":666.9921875,"194":666.9921875,"195":666.9921875,"196":666.9921875,"197":666.9921875,"198":1000,"199":722.16796875,"200":666.9921875,"201":666.9921875,"202":666.9921875,"203":666.9921875,"204":277.83203125,"205":277.83203125,"206":277.83203125,"207":277.83203125,"208":722.16796875,"209":722.16796875,"210":777.83203125,"211":777.83203125,"212":777.83203125,"213":777.83203125,"214":777.83203125,"215":583.984375,"216":777.83203125,"217":722.16796875,"218":722.16796875,"219":722.16796875,"220":722.16796875,"221":666.9921875,"222":666.9921875,"223":610.83984375,"224":556.15234375,"225":556.15234375,"226":556.15234375,"227":556.15234375,"228":556.15234375,"229":556.15234375,"230":889.16015625,"231":500,"232":556.15234375,"233":556.15234375,"234":556.15234375,"235":556.15234375,"236":277.83203125,"237":277.83203125,"238":277.83203125,"239":277.83203125,"240":556.15234375,"241":556.15234375,"242":556.15234375,"243":556.15234375,"244":556.15234375,"245":556.15234375,"246":556.15234375,"247":548.828125,"248":610.83984375,"249":556.15234375,"250":556.15234375,"251":556.15234375,"252":556.15234375,"253":500,"254":556.15234375,"255":500,"256":666.9921875}]])
38-
}
39-
4035
-- Create new PDF document
4136
function PDFGenerator.new(options)
4237
objCounter = 1
@@ -184,17 +179,12 @@ function PDFGenerator:addCustomFont(fontPath, fontName, fontWeight)
184179
-- Read font file
185180
local fontData = loadAsset(fontPath)
186181
local fontMetrics = loadAsset(fontPath:gsub("%.ttf$", ".json"))
182+
assert(fontMetrics, "You need the metrics json file")
187183

188184
self.custom_fonts = self.custom_fonts or {}
189185
self.custom_fonts[fullFontName] = fontObj
190186

191-
if fontMetrics then
192-
self.font_metrics[fullFontName] = decodeJson(fontMetrics)
193-
else
194-
-- Fallback to Helvetica metrics if no custom metrics provided
195-
self.font_metrics[fullFontName] = fontHelveticaMetrics[fontWeight] or fontHelveticaMetrics.normal
196-
end
197-
187+
self.font_metrics[fullFontName] = decodeJson(fontMetrics)
198188
-- Validate and normalize font metrics for better compatibility
199189
self:validateFontMetrics(fullFontName)
200190

@@ -234,7 +224,7 @@ end
234224
-- Generate widths array for better font rendering
235225
function PDFGenerator:generateWidthsArray(fontName)
236226
local widths = {}
237-
local fontMetrics = self.font_metrics[fontName] or fontHelveticaMetrics.normal
227+
local fontMetrics = self.font_metrics[fontName]
238228

239229
for i = 32, 255 do
240230
local width = fontMetrics[""..i] or 556
@@ -303,9 +293,7 @@ function PDFGenerator:validateFontMetrics(fontName)
303293
-- Ensure all required characters have valid widths
304294
for i = 32, 255 do
305295
if not metrics[""..i] or metrics[""..i] <= 0 then
306-
-- Use Helvetica metrics as fallback
307-
local fallbackMetrics = fontHelveticaMetrics.normal
308-
metrics[""..i] = fallbackMetrics[""..i] or 556
296+
metrics[""..i] = 556
309297
end
310298
end
311299

@@ -398,14 +386,8 @@ function PDFGenerator:getTextWidth(text, fontSize, fontWeight)
398386
fontSize = fontSize or 12
399387
fontWeight = fontWeight or "normal"
400388

401-
local fontMetrics = fontHelveticaMetrics -- default font metrics
402-
403389
self.font_metrics = self.font_metrics or {}
404-
if self.font_metrics[self.last_font.fontFamily .. "-" .. fontWeight] then
405-
fontMetrics = self.font_metrics[self.last_font.fontFamily .. "-" .. fontWeight]
406-
else
407-
fontMetrics = fontMetrics[fontWeight] or fontMetrics["normal"]
408-
end
390+
local fontMetrics = self.font_metrics[self.last_font.fontFamily .. "-" .. fontWeight]
409391

410392
local width = 0
411393
for i = 1, #text do

app/controllers/welcome_controller.lua

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,111 @@
11
local app = {
22
index = function()
3-
Page("welcome/index", "app")
4-
-- or
5-
-- WriteJSON({ demo = true })
3+
PDFGenerator = require("pdfgenerator")
4+
5+
local pdf = PDFGenerator.new({header_height = 50})
6+
7+
pdf:setHeader(function(pageId)
8+
pdf:addParagraph("Header - redbean.com PDF Generator - %s on %d" % { pageId, pdf:totalPage(self) }, { fontSize = 16, alignment = "left", newPage = false })
9+
pdf:drawLine(50, 842-50, 595 - 50, 842-50, 1)
10+
end)
11+
12+
-- Add a page (default A4 size)
13+
pdf:addPage()
14+
--pdf:addCustomFont("fonts/Helvetica.ttf", "helvetica", "normal")
15+
--pdf:addCustomFont("fonts/Helvetica-Bold.ttf", "helvetica", "bold")
16+
pdf:addCustomFont("fonts/TitilliumWeb-Regular.ttf", "titillium", "normal")
17+
pdf:addCustomFont("fonts/TitilliumWeb-Bold.ttf", "titillium", "bold")
18+
19+
20+
--local imgName = pdf:addImage(LoadAsset("usa.jpeg"), 1567, 444, "jpeg")
21+
--pdf:drawImage(imgName)
22+
23+
-- Add some text
24+
pdf:addParagraph([[
25+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
26+
]], { fontSize = 15, alignment = "justify", fontWeight = "bold" })
27+
28+
pdf:moveY(10)
29+
30+
pdf:addParagraph([[
31+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
32+
]], { fontSize = 15, alignment = "justify", fontWeight = "normal" })
33+
34+
pdf:moveY(10)
35+
36+
pdf:addParagraph([[
37+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
38+
]], { fontSize = 10, alignment = "right" })
39+
40+
pdf:moveY(10)
41+
42+
pdf:addParagraph([[
43+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
44+
]], { fontSize = 10, alignment = "center" })
45+
46+
pdf:moveY(10)
47+
48+
pdf:addParagraph([[
49+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
50+
]], { fontSize = 10, alignment = "left" })
51+
52+
pdf:moveY(10)
53+
54+
local headerColumns = {
55+
{ text = "Label", width = 305, fontSize = 10, alignment = "left", borderSides = { right = "false" } },
56+
{ text = "UnitPrice", width = 70, fontSize = 10, alignment = "right", borderSides = { left = "false", right = "false" } },
57+
{ text = "Qty", width = 50, fontSize = 10, alignment = "center", borderSides = { left = "false", right = "false" } },
58+
{ text = "Total Price", width = 70, fontSize = 10, alignment = "right", borderSides = { left = "false" } }
59+
}
60+
61+
local dataColumns = {}
62+
for i = 1, 3 do
63+
table.insert(dataColumns, {
64+
{ text = "Mac Mini M4 pro " .. i, width = 305, fontSize = 10, alignment = "left", borderSides = { right = "false" } },
65+
{ text = "$700", width = 70, fontSize = 10, alignment = "right", borderSides = { left = "false", right = "false" } },
66+
{ text = "2", width = 50, fontSize = 10, alignment = "center", borderSides = { left = "false", right = "false" } },
67+
{ text = "$1400", width = 70, fontSize = 10, alignment = "right", borderSides = { left = "false" } }
68+
})
69+
end
70+
71+
pdf:drawTable({
72+
header_columns = headerColumns,
73+
data_columns = dataColumns,
74+
header_options = { fillColor = "eee", borderColor = "eee" },
75+
data_options = { fillColor = "fff", borderColor = "eee" }
76+
}, { padding_x = 5, padding_y = 5 })
77+
78+
pdf:moveY(10)
79+
80+
local dataColumns = {}
81+
for i = 1, 10 do
82+
table.insert(dataColumns, {
83+
{ text = "Mac Mini M4 pro Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis l" .. i, width = 305, fontSize = 10, alignment = "left" },
84+
{ text = "$700", width = 70, fontSize = 10, alignment = "right" },
85+
{ text = "2", width = 50, fontSize = 10, alignment = "center" },
86+
{ text = "$1400", width = 70, fontSize = 10, alignment = "right" }
87+
})
88+
end
89+
90+
pdf:drawTable({
91+
header_columns = headerColumns,
92+
data_columns = dataColumns,
93+
header_options = { fillColor = "000", borderColor = "000", textColor = "fff" },
94+
data_options = { fillColor = "fff", borderColor = "eee", oddFillColor = "fafafa", evenFillColor = "fff" }
95+
}, { padding_x = 5, padding_y = 2 })
96+
97+
for i = 1, 1 do
98+
pdf:moveY(10)
99+
pdf:addParagraph([[
100+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
101+
102+
Morbi ultrices pharetra risus sed pellentesque. Integer id semper erat. Duis lobortis mollis erat, id commodo orci lobortis ut. Sed laoreet libero sed lorem sagittis, et lacinia arcu efficitur. Curabitur eu scelerisque elit. Aenean enim turpis, congue nec ipsum non, dapibus laoreet ex. Cras viverra congue tortor vitae rutrum.
103+
]], { fontSize = 10, alignment = "justify", fontWeight = "bold" })
104+
end
105+
106+
SetHeader("Content-Type", "application/pdf")
107+
Write(pdf:generate())
108+
6109
end,
7110
}
8111

0 commit comments

Comments
 (0)