feat: implement cbz writing and pdf reading
This commit is contained in:
		
							parent
							
								
									034f0b142c
								
							
						
					
					
						commit
						e8287d0c6e
					
				
					 10 changed files with 644 additions and 57 deletions
				
			
		
							
								
								
									
										51
									
								
								tests/pdf_reader_tests.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								tests/pdf_reader_tests.rs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
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<u8>, image::DynamicImage) {
 | 
			
		||||
    let mut img = image::ImageBuffer::<image::Rgb<u8>, _>::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"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue