luametalatex/luametalatex-pdf-pagetree.lua

50 lines
1.4 KiB
Lua
Raw Normal View History

2019-07-17 21:14:34 +02:00
local min = math.min
local format = string.format
local concat = table.concat
2020-07-01 14:10:30 +02:00
local pdfvariable = pdf.variable
local function write(pdf, tree, total, max)
2019-07-17 21:14:34 +02:00
tree = tree or pdf.pages
if #tree == 0 then
local id = pdf:getobj()
pdf:indirect(id, '<</Type/Pages/Kids[]/Count 0>>')
return id
end
max = max or 6 -- These defaults only work on the lowest level
total = total or #tree
local remaining = total
-- if #tree == 1 then
-- retur
local newtree = {}
local parent = ""
for i=0,(#tree-1)//6 do
local id = tree[-i]
newtree[i+1] = id
if 0 == i % 6 and #tree > 6 then
local parentid = pdf:getobj()
2019-07-17 21:14:34 +02:00
newtree[-(i//6)] = parentid
parent = format("/Parent %i 0 R", parentid)
2020-07-01 14:10:30 +02:00
elseif #tree <= 6 then
parent = pdfvariable.pagesattr
2019-07-17 21:14:34 +02:00
end
pdf:indirect(id, format('<</Type/Pages%s/Kids[%s 0 R]/Count %i>>', parent, concat(tree, ' 0 R ', 6*i+1, min(#tree, 6*i+6)), min(remaining, max)))
remaining = remaining - max
end
2020-07-01 14:10:30 +02:00
if newtree[0] then
return write(pdf, newtree, total, max*6)
2019-07-17 21:14:34 +02:00
end
return newtree[1]
end
local function newpage(pdf)
2019-07-17 21:14:34 +02:00
local pageid = pdf:getobj()
local pagenumber = #pdf.pages
pdf.pages[pagenumber+1] = pageid
if 0 == pagenumber % 6 then
pdf.pages[-(pagenumber//6)] = pdf:getobj()
end
return pageid, pdf.pages[-(pagenumber//6)]
end
return {
write = write,
newpage = newpage,
}