defmodule Pdf.Object do
@moduledoc false
defstruct number: nil, generation: "0", size: 0, value: nil
import Pdf.Size
@obj_start " obj\n"
@obj_end "\nendobj\n"
@obj_start_size byte_size(@obj_start)
@obj_end_size byte_size(@obj_end)
@generation_size 1
# space between object number and generation number
@initial_size @obj_start_size + @obj_end_size + @generation_size + 1
def new(number),
do: %__MODULE__{
number: to_string(number),
size: @initial_size + String.length(to_string(number))
}
def new(number, value), do: number |> new |> set_value(value)
def set_value(object, value), do: %{object | value: value}
def size(object), do: object.size + value_size(object.value)
def to_iolist(object) do
Pdf.Export.to_iolist([
object.number,
" ",
object.generation,
@obj_start,
Pdf.Object.value_to_iolist(object.value),
@obj_end
])
end
def reference(%__MODULE__{number: number, generation: generation}),
do: "#{number} #{generation} R"
def value_to_iolist(string) when is_binary(string), do: ["(", string, ")"]
def value_to_iolist(value), do: Pdf.Export.to_iolist(value)
defp value_size(string) when is_binary(string), do: 2 + size_of(string)
defp value_size(value), do: size_of(value)
defimpl Pdf.Size do
def size_of(%Pdf.Object{} = object), do: Pdf.Object.size(object)
end
defimpl Pdf.Export do
def to_iolist(object), do: Pdf.Object.to_iolist(object)
end
end