From 7399513bfce542311d45eaadade87d99eec43bad Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl Date: Thu, 17 Jul 2025 19:28:41 +0200 Subject: [PATCH] More --- crates/typst-cli/src/args.rs | 1 + crates/typst-cli/src/world.rs | 1 + crates/typst-library/src/lib.rs | 1 + crates/typst-library/src/visualize/image/mod.rs | 13 +++++++++++++ crates/typst-library/src/visualize/image/pdf.rs | 6 ++++++ 5 files changed, 22 insertions(+) create mode 100644 crates/typst-library/src/visualize/image/pdf.rs diff --git a/crates/typst-cli/src/args.rs b/crates/typst-cli/src/args.rs index 7459be0f2..b6b74fd9d 100644 --- a/crates/typst-cli/src/args.rs +++ b/crates/typst-cli/src/args.rs @@ -471,6 +471,7 @@ display_possible_values!(DiagnosticFormat); #[derive(Debug, Copy, Clone, Eq, PartialEq, ValueEnum)] pub enum Feature { Html, + PdfEmbedding } display_possible_values!(Feature); diff --git a/crates/typst-cli/src/world.rs b/crates/typst-cli/src/world.rs index 8ad766b14..ccd527d24 100644 --- a/crates/typst-cli/src/world.rs +++ b/crates/typst-cli/src/world.rs @@ -117,6 +117,7 @@ impl SystemWorld { .iter() .map(|&feature| match feature { Feature::Html => typst::Feature::Html, + Feature::PdfEmbedding => typst::Feature::PdfEmbedding }) .collect(); diff --git a/crates/typst-library/src/lib.rs b/crates/typst-library/src/lib.rs index 025e997c6..54d73115c 100644 --- a/crates/typst-library/src/lib.rs +++ b/crates/typst-library/src/lib.rs @@ -237,6 +237,7 @@ impl FromIterator for Features { #[non_exhaustive] pub enum Feature { Html, + PdfEmbedding } /// A group of related standard library definitions. diff --git a/crates/typst-library/src/visualize/image/mod.rs b/crates/typst-library/src/visualize/image/mod.rs index f1fa6381b..b600ab17e 100644 --- a/crates/typst-library/src/visualize/image/mod.rs +++ b/crates/typst-library/src/visualize/image/mod.rs @@ -2,6 +2,7 @@ mod raster; mod svg; +mod pdf; pub use self::raster::{ ExchangeFormat, PixelEncoding, PixelFormat, RasterFormat, RasterImage, @@ -468,11 +469,21 @@ impl ImageFormat { if is_svg(data) { return Some(Self::Vector(VectorFormat::Svg)); } + + if is_pdf(data) { + return Some(Self::Vector(VectorFormat::Pdf)) + } None } } +/// Checks whether the data looks like a PDF file. +fn is_pdf(data: &[u8]) -> bool { + let head = &data[..data.len().min(2048)]; + memchr::memmem::find(head, b"%PDF-").is_some() +} + /// Checks whether the data looks like an SVG or a compressed SVG. fn is_svg(data: &[u8]) -> bool { // Check for the gzip magic bytes. This check is perhaps a bit too @@ -493,6 +504,8 @@ fn is_svg(data: &[u8]) -> bool { pub enum VectorFormat { /// The vector graphics format of the web. Svg, + /// The PDF graphics format. + Pdf, } impl From for ImageFormat diff --git a/crates/typst-library/src/visualize/image/pdf.rs b/crates/typst-library/src/visualize/image/pdf.rs new file mode 100644 index 000000000..a9685393e --- /dev/null +++ b/crates/typst-library/src/visualize/image/pdf.rs @@ -0,0 +1,6 @@ +use std::sync::Arc; +use crate::foundations::Bytes; + +/// A PDF image. +#[derive(Clone, Hash)] +pub struct PdfImage(Bytes); \ No newline at end of file