use pdfrum_common::PdfVersion;
const DEFAULT_VERSION: PdfVersion = PdfVersion::PDF_1_7;
const fn is_honoured(version: PdfVersion) -> bool {
version.major == 1 && version.minor <= 7
}
pub(crate) fn write_header(
out: &mut Vec<u8>,
requested: Option<PdfVersion>,
document: Option<PdfVersion>,
) {
let version = match (requested, document) {
(Some(r), _) if is_honoured(r) => r,
(_, Some(d)) => d,
_ => DEFAULT_VERSION,
};
out.extend_from_slice(b"%PDF-1.");
out.push(b'0' + (version.minor % 10));
out.extend_from_slice(b"\r\n%\xA1\xB3\xC5\xD7\r\n");
}
#[cfg(test)]
mod tests {
use pdfrum_common::PdfVersion;
use super::write_header;
fn header(requested: Option<PdfVersion>, document: Option<PdfVersion>) -> String {
let mut out = Vec::new();
write_header(&mut out, requested, document);
String::from_utf8_lossy(out.get(..9).unwrap_or_default()).into_owned()
}
#[test]
fn the_documents_own_version_is_kept() {
assert_eq!(header(None, Some(PdfVersion::PDF_1_7)), "%PDF-1.7\r");
assert_eq!(header(None, Some(PdfVersion::PDF_1_4)), "%PDF-1.4\r");
}
#[test]
fn an_in_range_request_wins() {
assert_eq!(
header(Some(PdfVersion::PDF_1_4), Some(PdfVersion::PDF_1_7)),
"%PDF-1.4\r"
);
assert_eq!(
header(Some(PdfVersion::PDF_1_0), Some(PdfVersion::PDF_1_7)),
"%PDF-1.0\r"
);
assert_eq!(
header(Some(PdfVersion::PDF_1_7), Some(PdfVersion::PDF_1_4)),
"%PDF-1.7\r"
);
}
#[test]
fn an_out_of_range_request_falls_through() {
let requests = [
None,
Some(PdfVersion::new(0, 9)),
Some(PdfVersion::new(1, 8)),
Some(PdfVersion::PDF_2_0),
Some(PdfVersion::new(25, 5)),
];
for requested in requests {
assert_eq!(
header(requested, Some(PdfVersion::PDF_1_7)),
"%PDF-1.7\r",
"asked for {requested:?}"
);
}
}
#[test]
fn a_version_less_document_saves_as_one_seven() {
assert_eq!(header(None, None), "%PDF-1.7\r");
}
#[test]
fn the_binary_comment_follows_the_version() {
let mut out = Vec::new();
write_header(&mut out, None, Some(PdfVersion::PDF_1_7));
assert_eq!(out, b"%PDF-1.7\r\n%\xA1\xB3\xC5\xD7\r\n");
assert!(out.get(11..15).is_some_and(|c| c.iter().all(|b| *b > 127)));
}
}