defmodule Pdf.RefTable do
@moduledoc false
def to_iolist(objects, offset \\ 0) do
{objects_iolist, offset} = objects_to_iolist(objects, offset)
{[
"xref\n",
"0",
" ",
to_string(length(objects) + 1),
"\n",
first_reference(),
objects_iolist
], offset}
end
defp first_reference, do: "0000000000 65535 f \n"
defp objects_to_iolist(list, offset, acc \\ [])
defp objects_to_iolist([], offset, acc), do: {Enum.reverse(acc), offset}
defp objects_to_iolist([object | tail], offset, acc) do
size = object |> Pdf.Export.to_iolist() |> :binary.list_to_bin() |> byte_size()
iolist = object_to_ref(object, offset)
offset = offset + size
objects_to_iolist(tail, offset, [iolist | acc])
end
defp object_to_ref(object, offset) do
[
String.pad_leading(to_string(offset), 10, "0"),
" ",
String.pad_leading(object.generation, 5, "0"),
" n \n"
]
end
end