#![allow(dead_code)]
pub fn assemble_pdf(objects: &[Vec<u8>]) -> Vec<u8> {
assemble_pdf_with_version("1.4", objects)
}
pub fn assemble_pdf_with_version(version: &str, objects: &[Vec<u8>]) -> Vec<u8> {
let n = objects.len();
let mut bytes: Vec<u8> = Vec::with_capacity(1024);
bytes.extend_from_slice(format!("%PDF-{}\n", version).as_bytes());
bytes.extend_from_slice(b"%\xE2\xE3\xCF\xD3\n");
let mut offsets = vec![0usize; n + 1];
for (idx, body) in objects.iter().enumerate() {
let id = idx + 1;
offsets[id] = bytes.len();
bytes.extend_from_slice(format!("{} 0 obj\n", id).as_bytes());
bytes.extend_from_slice(body);
bytes.extend_from_slice(b"\nendobj\n");
}
let xref_off = bytes.len();
bytes.extend_from_slice(format!("xref\n0 {}\n0000000000 65535 f \n", n + 1).as_bytes());
for off in offsets.iter().skip(1) {
bytes.extend_from_slice(format!("{:010} 00000 n \n", off).as_bytes());
}
bytes.extend_from_slice(
format!(
"trailer\n<< /Size {} /Root 1 0 R >>\nstartxref\n{}\n%%EOF\n",
n + 1,
xref_off
)
.as_bytes(),
);
bytes
}
pub fn stream_obj(dict: &str, data: &[u8]) -> Vec<u8> {
let mut v = Vec::new();
v.extend_from_slice(format!("<< {} /Length {} >>\nstream\n", dict, data.len()).as_bytes());
v.extend_from_slice(data);
v.extend_from_slice(b"\nendstream");
v
}