feat: implement cbz writing and pdf reading
All checks were successful
Build and test / Clippy (pull_request) Successful in 44s
Build and test / Tests (pull_request) Successful in 48s
Checking yaml / Run yamllint (pull_request) Successful in 5s
Checking Renovate configuration / validate (pull_request) Successful in 1m4s
Build and test / Build AMD64 (pull_request) Successful in 49s
Build and test / Generate Documentation (pull_request) Successful in 59s
All checks were successful
Build and test / Clippy (pull_request) Successful in 44s
Build and test / Tests (pull_request) Successful in 48s
Checking yaml / Run yamllint (pull_request) Successful in 5s
Checking Renovate configuration / validate (pull_request) Successful in 1m4s
Build and test / Build AMD64 (pull_request) Successful in 49s
Build and test / Generate Documentation (pull_request) Successful in 59s
This commit is contained in:
parent
3aa68fbe12
commit
b35ccbe271
10 changed files with 643 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