pdfrum_doc/metadata.rs
1//! The document's XMP metadata packet, as bytes.
2//!
3//! There is no XML parsing here and none is planned. Upstream's only use of
4//! `/Metadata` is a scan for an Acrobat shared-review workflow marker, whose
5//! sole consumer prints an "unsupported feature" line to **stderr** — it
6//! reaches no output any consumer diffs. Callers that want the packet's
7//! contents parse it themselves.
8
9use pdfrum_common::{Diagnostics, Limits};
10use pdfrum_object::{Dict, Resolve};
11
12use crate::names;
13
14/// The catalog's `/Metadata` stream, decoded.
15///
16/// Returns nothing when the key is absent or does not hold a stream.
17///
18/// ```
19/// use pdfrum_common::{Diagnostics, Limits};
20/// use pdfrum_doc::xmp;
21/// use pdfrum_object::{Dict, NoResolve};
22///
23/// let (limits, mut diags) = (Limits::default(), Diagnostics::default());
24/// // Absent, or not holding a stream: nothing.
25/// assert!(xmp(&Dict::default(), &NoResolve, &limits, &mut diags).is_none());
26/// ```
27#[must_use]
28pub fn xmp<R: Resolve>(
29 catalog: &Dict,
30 r: &R,
31 limits: &Limits,
32 diags: &mut Diagnostics,
33) -> Option<Vec<u8>> {
34 let stream = catalog.stream(names::METADATA, r)?;
35 Some(pdfrum_filters::decode_chain(&stream, 0, r, limits, diags).data)
36}