Skip to main content

Module image

Module image 

Source
Expand description

PDF images.

§Test example

     use pdf_min::{Writer, html, writer::Fetcher, image::{ImageSpec,Image}};
     struct MyFetcher;
     impl Fetcher for MyFetcher {
        fn image(&mut self, w: &mut Writer, _name: &str) -> Image {         
            let mut data = Vec::new();
            for i in 0..3 * 16 * 16 {
                data.push( i as u8 );  // Red
                data.push( (i + 85 ) as u8 ); // Green
                data.push( (i + 170 ) as u8 ); // Blue
            }
            let ims = ImageSpec{ data: &data, width:16, height:16,
                bits_per_component:8, color_space: b"/DeviceRGB", other: b"" };
            Image::new( &ims, &mut w.b )
        }
     }
     let mut w = Writer::default();
     w.b.nocomp = true;
     w.font_size = 20;
     w.fetcher = Some(Box::new(MyFetcher));
  
     // Draw text with image
     html( &mut w, b"<p><b>Bold Text Before Image</b> <img width=32 src=myimg> Text after image" );
     let bytes = w.finish();
  
     use std::fs::File;
     use std::io::prelude::*;
  
     let mut file = File::create("image_test.pdf").unwrap();
     file.write_all(bytes).unwrap();

§JPG Test example

   // Setup the PDF Writer
   let mut doc = pdf_min::Writer::default();
   doc.b.nocomp = true;

   // Read jpg from file
   let file_bytes = std::fs::read("one.jpg").unwrap();

   // Use jpeg_decoder::Decoder to get jpg info ( color space, bits_per_component, width, height ).
   let mut decoder = jpeg_decoder::Decoder::new(std::io::Cursor::new(&file_bytes));
   decoder.read_info().unwrap();
   let info = decoder.info().unwrap();

   use jpeg_decoder::{PixelFormat};
   
   let color_space: &[u8] = match info.pixel_format {
       PixelFormat::RGB24 => b"/DeviceRGB",
       PixelFormat::CMYK32 => b"/DeviceCMYK",
       PixelFormat::L8 | PixelFormat::L16 => b"/DeviceGray",
   };

   let bits_per_component = match info.pixel_format {
       PixelFormat::L16 => 16,
       _ => 8
   };

   // Use img_parts::jpeg::Jpeg to make DCT (Discrete Cosine Transform) compressed data.
   let cdata =
   {
       let mut cdata = Vec::new();
       let jpeg = img_parts::jpeg::Jpeg::from_bytes(file_bytes.into()).unwrap();
       jpeg.encoder().write_to(&mut cdata).unwrap();
       cdata
   };

   // Make the ImageSpec.
   use pdf_min::{Px, image::{ImageSpec, Image}};
   let ims = ImageSpec {
       data: &cdata,
       width: info.width as Px,
       height: info.height as Px,
       color_space,
       bits_per_component,
       other: b"/Filter/DCT",
   };
   
   // Make the Image from the ImageSpec.
   let im = Image::new(&ims, &mut doc.b);

   // Draw the image on the current page.
   im.draw(&mut doc.p, 20.0, 40.0, 0.20);

   // Save the pdf as a file.
   let bytes = doc.finish();
   let mut file = std::fs::File::create("jpg_image_test.pdf").unwrap();
   use std::io::Write;
   file.write_all(bytes).unwrap();

Structs§

Image
PDF image - obj id, width and height
ImageSpec
PDF image specification - byte data and attributes that describe how image is encoded.