use cbz2pdf::formats::pdf::{PdfReader, PdfWriter}; use cbz2pdf::formats::{FormatReader, FormatWriter}; use cbz2pdf::model::{Document, ImagePage}; fn make_small_jpeg(w: u32, h: u32, rgb: [u8; 3]) -> (Vec, image::DynamicImage) { let mut img = image::ImageBuffer::, _>::new(w, h); for p in img.pixels_mut() { *p = image::Rgb(rgb); } let dynimg = image::DynamicImage::ImageRgb8(img); let mut buf = Vec::new(); { let mut cursor = std::io::Cursor::new(&mut buf); let mut enc = image::codecs::jpeg::JpegEncoder::new_with_quality(&mut cursor, 85); let rgb8 = dynimg.to_rgb8(); enc.encode(&rgb8, w, h, image::ColorType::Rgb8.into()) .unwrap(); } (buf, dynimg) } #[test] fn pdf_reader_extracts_jpeg_xobject_and_preserves_dct() { // Build a PDF with one JPEG-backed page let (jpeg_dct, dynimg) = make_small_jpeg(3, 2, [10, 20, 30]); let page = ImagePage { name: "p1.jpg".into(), image: dynimg.clone(), jpeg_dct: Some(jpeg_dct.clone()), }; let doc = Document::new(vec![page]); let temp_dir = tempfile::tempdir().expect("tmpdir"); let pdf_path = temp_dir.path().join("in.pdf"); PdfWriter.write(&doc, &pdf_path).expect("write pdf"); // Read back with PdfReader let out = PdfReader.read(&pdf_path).expect("read pdf"); assert_eq!(out.pages.len(), 1, "should have one page extracted"); let p = &out.pages[0]; assert_eq!(p.image.width(), dynimg.width()); assert_eq!(p.image.height(), dynimg.height()); assert!(p.jpeg_dct.is_some(), "should preserve DCT for JPEG images"); assert_eq!( p.jpeg_dct.as_ref().unwrap(), &jpeg_dct, "JPEG bytes should match" ); }